メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcMemoryPool.h

#include "dkcOSIndependent.h"
#include "dkcArrayOneByOne.h"

dkcMemoryPool.hのインクルード依存関係図

Include dependency graph

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

Included by dependency graph

ソースコードを見る。

構成

struct  dkc_SameObjectPoolNode
struct  dkc_SameObjectPool
struct  dkc_MemoryPool

マクロ定義

#define dkcSameObjectPoolFree(p)   dkcFree((void **)&(p));
 dkcSameObjectPoolAlloc()で確保したメモリ領域を即行free()してしまう。


型定義

typedef dkc_SameObjectPoolNode DKC_SAME_OBJECT_POOL_NODE
typedef dkc_SameObjectPool DKC_SAME_OBJECT_POOL
typedef dkc_MemoryPool DKC_MEMORY_POOL

列挙型

enum  { edkcSameObjectPool_Dynamic, edkcSameObjectPool_Static }

関数

DKC_EXTERN DKC_SAME_OBJECT_POOL
*WINAPI 
dkcAllocSameObjectPool (size_t object_size, size_t max_num, size_t recycle_size)
DKC_EXTERN DKC_SAME_OBJECT_POOL
*WINAPI 
dkcAllocSameObjectPoolDynamic (size_t object_size)
DKC_EXTERN int WINAPI dkcFreeSameObjectPool (DKC_SAME_OBJECT_POOL **p)
 dkcAllocSameObjectPool()で確保した領域を開放

DKC_EXTERN void * dkcSameObjectPoolAlloc (DKC_SAME_OBJECT_POOL *p)
 dkcAllocSameObjectPool()のobject_sizeで指定したサイズのメモリ領域

DKC_EXTERN void WINAPI dkcSameObjectPoolRecycle (DKC_SAME_OBJECT_POOL *p, void *pv)
 dkcSameObjectPoolAlloc()で確保したメモリ領域を再利用する為に返す関数(使用は奨励しません)

DKC_EXTERN int WINAPI dkcSameObjectPoolReserve (DKC_SAME_OBJECT_POOL *p)
DKC_EXTERN DKC_MEMORY_POOL
*WINAPI 
dkcAllocMemoryPool (size_t poolsize, UINT flag)
DKC_EXTERN int WINAPI dkcFreeMemoryPool (DKC_MEMORY_POOL **)
DKC_EXTERN void *WINAPI dkcMemoryPoolAlloc (size_t size)
DKC_EXTERN int WINAPI dkcMemoryPoolFree (void *p)
DKC_EXTERN int WINAPI dkcMemoryPoolSafeFree (void **pp)


マクロ定義

#define dkcSameObjectPoolFree  )     dkcFree((void **)&(p));
 

dkcSameObjectPoolAlloc()で確保したメモリ領域を即行free()してしまう。

dkcMemoryPool.h77 行で定義されています。

参照元 dkcSameObjectPoolRecycle().


型定義

typedef struct dkc_MemoryPool DKC_MEMORY_POOL
 

typedef struct dkc_SameObjectPool DKC_SAME_OBJECT_POOL
 

参照元 add_sop_pool(), alloc_sameobjectpool(), dkcAllocSameObjectPool(), dkcAllocSameObjectPoolDynamic(), dkcFreeSameObjectPool(), dkcSameObjectPoolAlloc(), dkcSameObjectPoolRecycle(), dkcSameObjectPoolReserve(), empty_sop_recycle(), free_sameobjectpool(), free_sop_recycle(), insert_sop_recycle(), と insert_sop_recycle_memory().

typedef struct dkc_SameObjectPoolNode DKC_SAME_OBJECT_POOL_NODE
 

参照元 add_sop_pool(), alloc_sameobjectpool(), alloc_sop_node(), dkcAllocSameObjectPool(), dkcFreeSameObjectPool(), dkcSameObjectPoolAlloc(), dkcSameObjectPoolReserve(), free_sop_node(), free_sop_recycle(), と insert_sop_recycle().


列挙型

anonymous enum
 

列挙型の値:
edkcSameObjectPool_Dynamic 
edkcSameObjectPool_Static 

dkcMemoryPool.h41 行で定義されています。


関数

DKC_EXTERN DKC_MEMORY_POOL* WINAPI dkcAllocMemoryPool size_t  poolsize,
UINT  flag
 

DKC_EXTERN DKC_SAME_OBJECT_POOL* WINAPI dkcAllocSameObjectPool size_t  object_size,
size_t  max_num,
size_t  recycle_size
 

dkcMemoryPool.c61 行で定義されています。

参照先 alloc_sameobjectpool(), alloc_sop_node(), DKC_SAME_OBJECT_POOL, DKC_SAME_OBJECT_POOL_NODE, dkcFreeSameObjectPool(), dkc_SameObjectPool::max_num, dkc_SameObjectPoolNode::next, dkc_SameObjectPool::now_num, NULL, dkc_SameObjectPool::obj_size, dkc_SameObjectPool::recycle_size, と dkc_SameObjectPool::root.

参照元 dkcAllocSameObjectPoolDynamic().

00063 {
00064     DKC_SAME_OBJECT_POOL *p; 
00065     DKC_SAME_OBJECT_POOL_NODE *t,*a;
00066     size_t i;
00067 
00068     if(0==recycle_size){
00069         recycle_size = max_num / 4;
00070         if(0==recycle_size){
00071             recycle_size = 1;
00072         }
00073     }
00074     p  = alloc_sameobjectpool(recycle_size);
00075 
00076     if(NULL==p){
00077         return NULL;
00078     }
00079 
00080     //set
00081     p->obj_size = object_size;
00082     p->root = NULL;
00083     //p->tail = NULL;
00084     p->max_num = max_num;
00085 
00086     p->recycle_size = recycle_size;
00087 
00088 
00089     t = alloc_sop_node(object_size);
00090     if(NULL==t){
00091         goto Error;
00092     }
00093     //p->root = p->tail = t;
00094     p->root = t;
00095 
00096     a = t;
00097     for(i = 0;i<max_num;i++){
00098         t = alloc_sop_node(object_size);
00099         if(NULL==t){
00100             goto Error;
00101         }
00102         //前確保したNodeの次はt;
00103         a->next = t;
00104         
00105         a = t;
00106     }
00107     //update state
00108     //p->tail = a;
00109     p->now_num = max_num;
00110     return p;
00111 Error:
00112     dkcFreeSameObjectPool(&p);
00113     return NULL;    
00114 
00115 }

DKC_EXTERN DKC_SAME_OBJECT_POOL* WINAPI dkcAllocSameObjectPoolDynamic size_t  object_size  ) 
 

引数:
object_size[in] プールしておく一個単位のメモリのサイズ とりあえず、dkcAllocSameObjectPool()の引数説明を読むのが面倒ならこれを呼んでおくべし。

dkcMemoryPool.c118 行で定義されています。

参照先 DKC_SAME_OBJECT_POOL, と dkcAllocSameObjectPool().

00118                                                                               {
00119     return dkcAllocSameObjectPool(object_size,1024,256);
00120 }

DKC_EXTERN int WINAPI dkcFreeMemoryPool DKC_MEMORY_POOL **   ) 
 

DKC_EXTERN int WINAPI dkcFreeSameObjectPool DKC_SAME_OBJECT_POOL **  p  ) 
 

dkcAllocSameObjectPool()で確保した領域を開放

dkcMemoryPool.c140 行で定義されています。

参照先 DKC_SAME_OBJECT_POOL, DKC_SAME_OBJECT_POOL_NODE, edk_FAILED, free_sameobjectpool(), free_sop_node(), free_sop_recycle(), dkc_SameObjectPoolNode::next, NULL, と dkc_SameObjectPool::root.

参照元 dkcAllocSameObjectPool().

00140                                                            {
00141     DKC_SAME_OBJECT_POOL *p = (*pp);
00142     DKC_SAME_OBJECT_POOL_NODE *n,*t;
00143     if(NULL==pp || NULL==p){
00144         return edk_FAILED;
00145     }
00146     //ノードを開放
00147     n = p->root;
00148 
00149     while(NULL != n){
00150         t = n->next;
00151         free_sop_node(n);
00152         n = t;
00153     }
00154     //最後もお忘れなく・・・
00155     //free_sop_node(    p->tail );
00156 
00157     //リサイクル領域を開放
00158     free_sop_recycle(p);
00159 
00160     //最終領域を開放
00161     return free_sameobjectpool(p);
00162 }

DKC_EXTERN void* WINAPI dkcMemoryPoolAlloc size_t  size  ) 
 

DKC_EXTERN int WINAPI dkcMemoryPoolFree void *  p  ) 
 

DKC_EXTERN int WINAPI dkcMemoryPoolSafeFree void **  pp  ) 
 

DKC_EXTERN void* dkcSameObjectPoolAlloc DKC_SAME_OBJECT_POOL p  ) 
 

dkcAllocSameObjectPool()のobject_sizeで指定したサイズのメモリ領域

覚え書き:
内部にプールがなくなってもdkcAllocSameObjectPool()で指定したmax_num分をプールしなおします。 NULLを返す頻度はmallocと同じだと思います。

dkcMemoryPool.c211 行で定義されています。

参照先 DKC_SAME_OBJECT_POOL, DKC_SAME_OBJECT_POOL_NODE, dkcmNOT_ASSERT, dkcSameObjectPoolReserve(), FALSE, free_sop_node(), insert_sop_recycle(), dkc_SameObjectPoolNode::next, dkc_SameObjectPool::now_num, NULL, dkc_SameObjectPoolNode::pool, と dkc_SameObjectPool::root.

00211                                                      {
00212     DKC_SAME_OBJECT_POOL_NODE *n = p->root;
00213     void *r = n->pool;
00214     //dkcmNOT_ASSERT(0==p->now_num && n == p->tail);
00215     if(0==p->now_num){
00216         if(FALSE==dkcSameObjectPoolReserve(p)){
00217             return NULL;
00218         }
00219         return dkcSameObjectPoolAlloc(p);
00220     }
00221 
00222     //rootの更新
00223     p->root = n->next;
00224 
00225     //使用済みなのでNULL
00226     n->pool = NULL;
00227     n->next = NULL;
00228 
00229     //未使用領域に入れる。
00230     if(FALSE==insert_sop_recycle(p,n)){
00231         //n->pool自体はNULLにしているのでpoolまで開放されない
00232         free_sop_node(n);
00233     }
00234     //マイナス
00235     p->now_num--;
00236 
00237     
00238 #if 0
00239     if(0==p->now_num /*&& p->root == NULL*/)
00240     {
00241         dkcmNOT_ASSERT(p->root != NULL);
00242         p->tail = NULL;
00243 
00244     }
00245 #endif
00246 
00247     return r;
00248 }

DKC_EXTERN void WINAPI dkcSameObjectPoolRecycle DKC_SAME_OBJECT_POOL p,
void *  pv
 

dkcSameObjectPoolAlloc()で確保したメモリ領域を再利用する為に返す関数(使用は奨励しません)

覚え書き:
この関数の仕様は奨励しません。 なぜならpvに入れるメモリアドレスを少しでも間違ったらエラーに直結するからです。 素直にdkcSameObjectPoolReserve()とdkcSameObjectPoolFree()で対応した方が無難です。

dkcMemoryPool.c252 行で定義されています。

参照先 DKC_EXTERN, DKC_SAME_OBJECT_POOL, dkcSameObjectPoolFree, FALSE, と insert_sop_recycle_memory().

00252                                                                                  {
00253     if(FALSE==insert_sop_recycle_memory(p,pv))
00254     {//失敗したら廃棄処分
00255         dkcSameObjectPoolFree(pv);
00256     }
00257 }

DKC_EXTERN int WINAPI dkcSameObjectPoolReserve DKC_SAME_OBJECT_POOL p  ) 
 

dkcMemoryPool.c304 行で定義されています。

参照先 add_sop_pool(), alloc_sop_node(), BOOL, BYTE, DKC_SAME_OBJECT_POOL, DKC_SAME_OBJECT_POOL_NODE, dkcAllocateFast(), FALSE, dkc_SameObjectPool::flag, free_sop_node(), dkc_SameObjectPool::max_num, dkc_SameObjectPool::now_num, NULL, dkc_SameObjectPool::obj_size, dkc_SameObjectPoolNode::pool, dkc_SameObjectPool::recycle_pool, dkc_SameObjectPool::recycle_size, と TRUE.

参照元 dkcSameObjectPoolAlloc().

00304                                                              {
00305     size_t i,nel = p->recycle_size;
00306 
00307     DKC_SAME_OBJECT_POOL_NODE *rp = *(p->recycle_pool);
00308     BYTE *flag = p->flag;
00309     BOOL r = FALSE;
00310 
00311     for(i=0;i<nel;i++){
00312         if(TRUE==flag[i])
00313         {//リサイクル領域にリサイクルすべき領域を発見
00314             if(NULL==rp->pool)
00315             {//リサイクルすべき領域のプールには何も入っていなかった。
00316                 //なので確保。
00317                 rp->pool = dkcAllocateFast(p->obj_size);
00318             }
00319             if(FALSE==add_sop_pool(p,rp))
00320             {//もう入らないらしい。
00321 
00322                 //ここではfreeしなくてOK。
00323                 return FALSE;
00324             }
00325 
00326             //update
00327             r = TRUE;
00328             flag[i] = FALSE;
00329         }
00330     }
00331 
00332     if(p->max_num > p->now_num)
00333     {//足りない・・・
00334         for(;;){
00335             //rpの再利用
00336             rp = alloc_sop_node(p->obj_size);
00337             if(NULL==rp)
00338             {//メモリが確保できない・・・アホPCめ!!!
00339                 return FALSE;
00340             }
00341 
00342             if(FALSE==add_sop_pool(p,rp))
00343             {//もう入らないらしい。(多分無いけど・・・)
00344 
00345                 //ここでこの関数を忘れてはいけない。
00346                 free_sop_node(rp);
00347                 return FALSE;
00348             }
00349             
00350             
00351             if(p->max_num <= p->now_num){
00352                 break;
00353             }
00354         }//end of for
00355         r = TRUE;
00356 
00357     }
00358     return r;
00359 }


dkutil_cに対してTue Dec 7 01:10:18 2004に生成されました。 doxygen 1.3.6