#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 } |