#include "dkcOSIndependent.h"#include "dkcArrayOneByOne.h"dkcMemoryPool.hのインクルード依存関係図

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

|
|
dkcSameObjectPoolAlloc()で確保したメモリ領域を即行free()してしまう。
dkcMemoryPool.h の 77 行で定義されています。 |
|
|
|
|
|
|
|
dkcMemoryPool.h の 41 行で定義されています。
00041 {
00042 edkcSameObjectPool_Dynamic,
00043 edkcSameObjectPool_Static,
00044 };
|
|
||||||||||||
|
|
|
||||||||||||||||
|
dkcMemoryPool.c の 61 行で定義されています。 参照先 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 }
|
|
|
dkcMemoryPool.c の 118 行で定義されています。 参照先 DKC_SAME_OBJECT_POOL, と dkcAllocSameObjectPool().
00118 {
00119 return dkcAllocSameObjectPool(object_size,1024,256);
00120 }
|
|
|
|
|
|
dkcAllocSameObjectPool()で確保した領域を開放
dkcMemoryPool.c の 140 行で定義されています。 参照先 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.
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 }
|
|
|
|
|
|
|
|
|
|
|
|
dkcAllocSameObjectPool()のobject_sizeで指定したサイズのメモリ領域
dkcMemoryPool.c の 211 行で定義されています。 参照先 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 }
|
|
||||||||||||
|
dkcSameObjectPoolAlloc()で確保したメモリ領域を再利用する為に返す関数(使用は奨励しません)
dkcMemoryPool.c の 252 行で定義されています。 参照先 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 }
|
|
|
dkcMemoryPool.c の 304 行で定義されています。 参照先 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.
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 }
|
1.3.6