HM 内存池设计(2) HM6.0内存池设计

用于HM6.0代码中的内存池。

相对于(1)的改进:

a.chunk的大小从64bytes开始,到64KB.max_free_chunk[MAX_INDEX] 表示各个size的数目。

const uint32_t chunk_size[MAX_INDEX]={
/*    64 B,128B,256B,320B,512B,    */
    1    ,2     ,4      ,5   ,   8,
/*    1  K,2  K,4  K,8  K,16 K,  */
    1<<4,1<<5,1<<6,1<<7,1<<8,
/*    32 K,64 K,                   */
    1<<9,1<<10};//最小内存块BOUNDARY_SIZE(64B)的多少倍

b.预先分配一块大的内存LARGE_BLOCK,大于64KB的从LARGE_BLOCK分配,LARGE_BLOCK不足时再向系统分配。分配时找到一个比要分配的大小 大的MemLargeBlock,从末尾分配空间出去。释放时,空闲的LARGE_BLOCK块以双向链表表示,按照地址从低到高的顺序排列插入链表,并检查能否与前后MemLargeBlock合并。

c.HM6.0大于64KB的全局内存(GlobleLargeMem),未采用b.的策略,而是事先计算好了大小分配好。

源代码:

 1 /*
 2  ============================================================================
 3  Name        : mempool.h
 4  Author      : mlj
 5  Version     : 0.1
 6  ============================================================================
 7  */
 8 
 9 #ifndef MEMPOOL_
10 #define MEMPOOL_
11 #include <stdint.h>
12 
13 #define MEM_ANALYSIS //统计memory的信息
14 #define  MAX_INDEX 12 
15 
16 #define     FIX_BLOCK        (0x01<<7)  //MemBlock
17 #define     LARGE_BLOCK        (0x01<<6)  //MemLargeBlock
18 #define     SYSTEM_BLOCK    (0x01<<5)  //不是从内存池得到的,直接释放给系统
19 #define     FREED_BLOCK     (0x01<<4) //BlockInfo的低第4bit,表示是否已经释放过了。防止连续重复释放造成混乱
20 
21 typedef uint8_t BlockInfo;//BlockInfo 段数据类型,bit7-5表示Block类型,
22 typedef struct MemBlock
23 {
24     uint32_t    index;//size
25     uint32_t    nfree;//可用的最小内存单元数
26     uint32_t    nfirst;//下一个最小可用内存单元编号
27     struct MemBlock*    pNextBlock;//下一个index值相同的MemBlock
28 }MemBlock;
29 
30 typedef struct MemLargeBlock
31 {
32     char         *beginp;          /**< pointer to begin of memory */
33     char         *endp;                 /**< pointer to end of  memory [beginp,endp)*/ 
34 
35     struct MemLargeBlock *prev;
36     struct MemLargeBlock *next;
37 #ifdef MEM_ANALYSIS
38 #endif
39 }MemLargeBlock;
40 
41 typedef struct MemPool
42 {
43     MemLargeBlock    *head;//双向链表
44     MemBlock *freeblock[MAX_INDEX];
45     char *pMemory;
46     char *pLargeMemory;
47 }MemPool;
48 
49 typedef struct GlobleLargeMem
50 {
51     char *pLarge;
52     char *pLarge_aligned;
53     uint32_t pLarge_size;
54     uint32_t pLarge_aligned_size;
55     uint32_t pLarge_usedsize;
56     uint32_t pLarge_aligned_usedsize;
57 }GlobleLargeMem;
58 extern GlobleLargeMem  myGloble;
59 extern MemPool mypool;
60 void* MemPool_malloc(uint32_t in_size);
61 void* MemPool_calloc(uint32_t count,uint32_t size);
62 void MemPool_free(void* _Memory);
63 void MemPool_destroy(MemPool *pool);
64 void MemPool_create(MemPool *pool,uint32_t iPicWith,uint32_t iPicHeght);
65 
66 void GlobleLargeMem_Create(GlobleLargeMem* globle_mem,uint32_t iPicWith,uint32_t iPicHeght,uint32_t GOPsize,uint32_t MaxDecPicBuffering);
67 void GlobleLargeMem_Destory(GlobleLargeMem* globle_mem);
68 char* GlobleLargeMem_malloc(uint32_t size);
69 char* GlobleLargeMem_Xmalloc(uint32_t size);
70 void GlobleLargeMem_free(void *p);
71 void GlobleLargeMem_Xfree(void *p);
72 
73 #endif
mempool.c
  1 /*
  2  ============================================================================
  3  Name        : mempool.c
  4  Author      : mlj
  5  Version     : 0.1
  6  ============================================================================
  7  */
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <memory.h>
 11 #include "mempool.h"
 12 
 13 uint32_t max_free_chunk[MAX_INDEX]={
 14     571+10,  506+10, 6209+10,  324+10,  428+10, 2452+10,
 15     749+10,  666+5,  317+5,  315+5,    1,    2};//各块数目
 16 const uint32_t chunk_size[MAX_INDEX]={
 17 /*    64 B,128B,256B,320B,512B,    */
 18     1    ,2     ,4      ,5   ,   8,
 19 /*    1  K,2  K,4  K,8  K,16 K,  */
 20     1<<4,1<<5,1<<6,1<<7,1<<8,
 21 /*    32 K,64 K,                   */
 22     1<<9,1<<10};//最小内存块BOUNDARY_SIZE(64B)的多少倍
 23 
 24 MemPool mypool;
 25 #ifdef MEM_ANALYSIS
 26 uint32_t    max_used[MAX_INDEX]={0};//达到的用到的chunk数目最大值
 27 uint32_t    system_malloc=0;//额外从系统malloc的大小
 28 int32_t    Malloc_Free_check[MAX_INDEX] = {0};
 29 #endif
 30 #define BOUNDARY_INDEX 6
 31 #define BOUNDARY_SIZE (1 << BOUNDARY_INDEX) // 最小内存块大小64B
 32 
 33 #define CHUNK_HEAD_SIZE ( sizeof(MemBlock*)+ sizeof(uint32_t)+sizeof(BlockInfo) ) 
 34 #define CHUNK_DATA_SIZE(index)    ( BOUNDARY_SIZE*(chunk_size[index]))  // 4096*(1<<19)  默认为int 类型,会越界  ( 1<<(chunk_size[index]+BOUNDARY_INDEX))  
 35 #define MEMBLOCK_SIZE(index)    ( sizeof(MemBlock) + max_free_chunk[(index)]*( CHUNK_HEAD_SIZE + CHUNK_DATA_SIZE(index) ) )
 36  
 37 #define APR_ALIGN(size, boundary)   (((size)+ ((boundary) - 1)) &~((boundary) - 1))
 38 #define LARGE_BLOCK_SIZE    (((uint32_t)1<<20)*19)  //10M
 39 
 40 void MemBlock_init(MemBlock *block,uint32_t max_free_chunk)
 41 {
 42     uint32_t i = 0;
 43     char *p = NULL;
 44     block->nfree = max_free_chunk;
 45     block->nfirst = 0;
 46     block->pNextBlock = NULL;
 47 
 48     p = (char*)block;
 49     ((char*)p) += sizeof(MemBlock); //第0个chunk头地址
 50     for(i=0;i<block->nfree;i++)
 51     {
 52         ( *((MemBlock**)p) ) = (MemBlock*)block; //chunk 头四个字节存放所在的MemBlock的地址
 53         ((char*)p) += sizeof(MemBlock*);
 54         *((uint32_t*)p) = i+1; //存放下一个可用的chunk的index
 55         ((char*)p) += sizeof(uint32_t);
 56         *((BlockInfo*)p) = FIX_BLOCK; //设置block类型及index
 57         ((char*)p) += sizeof(BlockInfo)+CHUNK_DATA_SIZE(block->index);
 58     }
 59 }
 60 
 61 _inline void MemLargeBlock_init(MemLargeBlock *block,uint32_t size)
 62 {
 63     block->beginp = (char *)block;
 64     block->endp = ((MemLargeBlock*)block)->beginp + size;
 65     block->prev = (MemLargeBlock*)block;
 66     block->next = (MemLargeBlock*)block;
 67 }
 68 
 69 void* MemLargeBlock_malloc(uint32_t size)
 70 {
 71     MemLargeBlock *pblock = mypool.head;
 72     do 
 73     {
 74         uint32_t blockfreesize = pblock->endp - pblock->beginp - sizeof(MemLargeBlock);
 75         if ( (sizeof(MemLargeBlock) + sizeof(BlockInfo) + size) <= blockfreesize)
 76         {
 77             char* pmalloc = pblock->endp  - sizeof(MemLargeBlock) - sizeof(BlockInfo)- size;//分配出去的空间之前有两个字段
 78             pblock->endp = pmalloc;
 79             MemLargeBlock_init((MemLargeBlock*)pmalloc,(sizeof(MemLargeBlock) + sizeof(BlockInfo) + size));
 80             *( (BlockInfo*)((char*)pmalloc + sizeof(MemLargeBlock) ) ) = LARGE_BLOCK;            
 81             return ((char*)pmalloc + sizeof(MemLargeBlock) + sizeof(BlockInfo) );
 82         }
 83         pblock = pblock->next;        
 84     } while (pblock != mypool.head);
 85     
 86     if (pblock == mypool.head) //链表中没有这么大的内存
 87     {
 88         char *pmalloc = (char*) malloc(sizeof(BlockInfo) + size);
 89 #ifdef MEM_ANALYSIS
 90         system_malloc+=sizeof(BlockInfo) + size;//额外从系统malloc的大小
 91 #endif
 92         if (pmalloc)
 93         {
 94             *( (BlockInfo*)((char*)pmalloc ) ) = SYSTEM_BLOCK;            
 95             return ((char*)pmalloc + sizeof(BlockInfo) );
 96         }
 97         else
 98         {
 99             printf("memory malloc failed!size:%d \n",size);
100             exit(0);
101         }
102         
103     }
104     return NULL;
105 }
106 
107 void MemLargeBlock_free(void* _Memory)
108 {
109     MemLargeBlock *pblock = (MemLargeBlock*) ( (char*)_Memory  - sizeof(MemLargeBlock) - sizeof(BlockInfo) );
110     MemLargeBlock *pblock2 = mypool.head;
111     pblock->prev = pblock->next =NULL;
112     //空闲块插入链表,并且合并,链表按照地址从低到高的顺序排列
113     if (pblock->beginp>=pblock2->prev->endp)//在最后一个节点之后
114     {
115         if (pblock->beginp == pblock2->prev->endp)
116         {
117             pblock2->prev->endp = pblock->endp;
118         } 
119         else//插到最后
120         {
121             pblock->next = pblock2;
122             pblock->prev = pblock2->prev;
123             pblock2->prev->next = pblock;
124             pblock2->prev = pblock;
125         }
126         return;
127     }
128     
129     do 
130     {
131         if ( pblock->endp<=pblock2->next->beginp )//在pblock2 与 pblock2->next之间
132         {
133             if ( pblock->endp == pblock2->next->beginp && pblock->beginp == pblock2->endp ) //与两者都相邻
134             {
135                 pblock2->endp = pblock2->next->endp; //三块合并
136                 pblock2->next->next->prev = pblock2;                
137                 pblock2->next = pblock2->next->next;
138             } 
139             else if(pblock->beginp == pblock2->endp ) //与pblock2相邻
140             {
141                 pblock2->endp = pblock->endp; //直接加到pblock2之后
142             }
143             else if ( pblock->endp == pblock2->next->beginp ) //与pblock2->next相邻
144             {
145                 pblock->endp = pblock2->next->endp;//与pblock2->next合并,
146                 pblock2->next->next->prev = pblock;
147                 pblock->prev = pblock2;
148                 pblock->next = pblock2->next->next;
149                 pblock2->next = pblock;
150             }
151             else // 在两者之间,但无相邻
152             {
153                 pblock2->next->prev = pblock;
154                 pblock->prev = pblock2;
155                 pblock->next = pblock2->next;
156                 pblock2->next = pblock;
157             }
158             return;
159         }
160         pblock2 = pblock2->next;
161 
162     } while (pblock2->next != mypool.head);    
163 }
164 void MemPool_create(MemPool *pool,uint32_t iPicWith,uint32_t iPicHeght)
165 {
166     size_t pool_size = 0;//
167     size_t i;
168     char* p = NULL;
169     {//根据图像大小,初始化max_free_chunk[MAX_INDEX]
170         if (iPicWith==416&&iPicHeght==240)
171             {
172                 uint32_t temp_free_chunk[MAX_INDEX]={
173                     571+10,  506+10, 6209+10,  324+10,  428+10, 2452+10,
174                     749+10,  666+5,  317+5,  315+5,    1,    2};//各块数目(编码20帧测得结果),再加10或5,随编码帧数所需会有1-2的抖动
175                 memcpy(max_free_chunk,temp_free_chunk,MAX_INDEX*sizeof(uint32_t));
176             }
177         else if (iPicWith==1280&&iPicHeght==720)
178             {
179                 uint32_t temp_free_chunk[MAX_INDEX]={
180                     955+10, 2528+10,50717+10, 1283+10, 2548+10,19514+10,
181                     4979+10, 4909+5, 2443+5, 2447+5,    4,    2};//各块数目
182                     memcpy(max_free_chunk,temp_free_chunk,MAX_INDEX*sizeof(uint32_t));
183             }
184         else
185             {
186                 fprintf(stdout,"Mempool(max_free_chunk) of the pic size does not set!May malloc memory from system\n");
187                 fprintf(stdout,"set macro MEM_ANALYSIS and add the size in MemPool_create() \n");
188             }        
189     }
190     for (i=0;i<MAX_INDEX;i++)
191     {
192         pool_size += MEMBLOCK_SIZE(i);
193     }
194     pool_size += LARGE_BLOCK_SIZE;
195     p = (char *)malloc(pool_size);
196     if(p == NULL)
197     {
198         printf("memory malloc failed!/n");
199         exit(0);
200     }
201     
202     //memset(p,0,pool_size);
203     pool->pMemory = p;
204 
205     for (i=0;i<MAX_INDEX;i++)
206     {
207         pool->freeblock[i] = (MemBlock*) (p);
208         pool->freeblock[i]->index = i;
209         MemBlock_init(pool->freeblock[i],max_free_chunk[i]);
210         ((char*)p) += MEMBLOCK_SIZE(i);//注意转为char* 在加偏移
211     }
212 
213     pool->pLargeMemory = (char*)p;
214     pool->head = (MemLargeBlock *)(pool->pLargeMemory);
215     MemLargeBlock_init(pool->head,LARGE_BLOCK_SIZE);
216 
217 }
218 
219 void MemPool_destroy(MemPool *pool)
220 {
221     size_t i;
222 #ifdef MEM_ANALYSIS
223     size_t pool_size = 0;
224     for (i=0;i<MAX_INDEX;i++)
225     {
226         pool_size += MEMBLOCK_SIZE(i);
227     }
228     printf("MemPool analysis:\n");
229     printf("FIX_BLOCK malloc memory size :%dKB  %dM\n",pool_size>>10,pool_size>>20);
230     printf("LARGE_BLOCK malloc memory size :%dKB  %dM\n",LARGE_BLOCK_SIZE>>10,LARGE_BLOCK_SIZE>>20);
231     printf("system malloc memory size:%dKB  %dM\n",system_malloc>>10,system_malloc>>20);
232     printf("index   :");
233     for (i=0;i<MAX_INDEX/2;i++)
234     {
235         printf("%5d ",i);
236     }
237     printf("\nmax_used:");
238     for (i=0;i<MAX_INDEX/2;i++)
239     {
240         printf("%5d,",max_used[i]);
241     }
242     printf("\nblock_len:");
243     for (i=0;i<MAX_INDEX/2;i++)
244     {
245         uint32_t block_len = 0;
246         MemBlock* pblock = NULL;
247         pblock = mypool.freeblock[i];
248         do 
249         {
250             block_len++;
251         }while (pblock=pblock->pNextBlock);
252         printf("%5d ",block_len);
253     }
254 
255     printf("\nindex   :");
256     for (i=MAX_INDEX/2;i<MAX_INDEX;i++)
257     {
258         printf("%5d ",i);
259     }
260     printf("\nmax_used:");
261     for (i=MAX_INDEX/2;i<MAX_INDEX;i++)
262     {
263         printf("%5d,",max_used[i]);
264     }
265     printf("\nblock_len:");
266     for (i=MAX_INDEX/2;i<MAX_INDEX;i++)
267     {
268         uint32_t block_len = 0;
269         MemBlock* pblock = NULL;
270         pblock = mypool.freeblock[i];
271         do 
272         {
273             block_len++;
274         }while (pblock=pblock->pNextBlock);
275         printf("%5d ",block_len);
276     }
277     for (i=0;i<MAX_INDEX;i++)
278         printf("\nMalloc_Free_check[%d]:%d ",i,Malloc_Free_check[i]);
279 #endif
280 
281     for (i=0;i<MAX_INDEX;i++)
282     {
283         MemBlock* pblock = NULL;
284         pblock = mypool.freeblock[i];
285         while (pblock->pNextBlock)
286         {
287             MemBlock* tmp = pblock->pNextBlock;
288             BlockInfo blocktype =  *( (BlockInfo*)((char*)tmp - sizeof(BlockInfo)) );
289             pblock->pNextBlock = tmp->pNextBlock;
290             if (blocktype&SYSTEM_BLOCK)//来自系统分配
291             {
292                 free((char*)tmp - sizeof(BlockInfo));
293             }            
294         }
295     }
296     free(pool->pMemory);
297     pool->pMemory = NULL;
298 }
299 
300 void* MemPool_malloc(size_t in_size)
301 {
302     size_t size; 
303     size_t index;
304     
305     if (in_size > CHUNK_DATA_SIZE(MAX_INDEX-1)) {
306         printf("malloc large size:%d KB\n",in_size>>10);
307         return MemLargeBlock_malloc(in_size); //大于最大固定大小内存块(64K)的处理
308     }
309    /* Find the index for this  size 
310      */
311     index = MAX_INDEX;
312     if (in_size <= BOUNDARY_SIZE)
313     {
314         size = BOUNDARY_SIZE;
315         index = 0;
316     }
317     else
318     {
319         size = APR_ALIGN(in_size,BOUNDARY_SIZE);
320         index = 1; //从1开始找index ,while(index<MAX_INDEX)
321         size = size>>BOUNDARY_INDEX;//size = size/BOUNDARY_SIZE,BOUNDARY_SIZE的倍数
322         while(index<MAX_INDEX)
323         {
324             if ( size>(chunk_size[index-1]) && size<=(chunk_size[index]) ) //
325             {
326                 break;
327             }
328             index++;
329         }
330     }
331 
332     if (index<MAX_INDEX)
333     {
334         MemBlock* pblock = NULL;
335         pblock = mypool.freeblock[index];
336          //寻找block链表上第一个存在空闲chunk的block
337         do 
338         {
339             if (pblock->nfree>0) //找到,退出
340             {
341                 break;
342             }
343             else if (pblock->pNextBlock == NULL) //已满,下一memblock又不存在
344             {
345                 char *p = NULL;
346                 if (max_free_chunk[index] == 0)
347                 {
348                     max_free_chunk[index] = 1;
349                 }
350                 
351                 p = (char*) MemLargeBlock_malloc(MEMBLOCK_SIZE(index));//从LARGE_BLOCK 分配,暂时不释放,destroy pool是释放
352                 if (p == NULL)
353                 {
354                     printf("memory malloc(from large block) failed!/n");
355                     exit(0);
356                 }
357                 //memset(p,0,MEMBLOCK_SIZE(index));                
358                 pblock->pNextBlock = (MemBlock*) (p);
359                 pblock->pNextBlock->index = index;
360                 pblock=pblock->pNextBlock;
361                 MemBlock_init(pblock,max_free_chunk[index]);
362                 break;
363             }
364             else
365             {
366                 pblock=pblock->pNextBlock;
367             }
368         }while (pblock);
369         
370         
371         if (pblock->nfree > 0)
372         {
373             uint32_t chunk_id = pblock->nfirst;//待分配的chunk的id
374             char* pchunk = (char*)( pblock ) + sizeof(MemBlock)+(CHUNK_HEAD_SIZE+CHUNK_DATA_SIZE(index))*chunk_id;//第index个chunk的首地址
375             pchunk = pchunk + sizeof(MemBlock*) ;//向后偏移四个字节,指向chunk id 区
376             pblock->nfirst = *((uint32_t*)pchunk) ;//更新下一个可用chunk的id
377             *((uint32_t*)pchunk) = chunk_id; //已分配出去的chunk,chunkid区记下自己的id
378             (char*)pchunk  = (char*)pchunk  + sizeof(uint32_t) ;//指向BlockInfo 区
379             *((BlockInfo*)pchunk) = (*((BlockInfo*)pchunk))&(~FREED_BLOCK);
380             pblock->nfree--;
381 #ifdef MEM_ANALYSIS
382             {
383                 uint32_t used_chunk = 0;
384                 uint32_t i=index;
385                 Malloc_Free_check[i]++;
386                 //for (i=0;i<MAX_INDEX;i++)
387                 {
388                     MemBlock* pblock = NULL;
389                     pblock = mypool.freeblock[i];
390                     used_chunk = 0;
391                     do 
392                     {
393                         used_chunk += max_free_chunk[i]-pblock->nfree;
394                     }while (pblock=pblock->pNextBlock);
395                     if(used_chunk>max_used[i])
396                         max_used[i] = used_chunk;
397                 }
398             }
399 #endif
400             return ( (char*)pchunk +  sizeof(BlockInfo));
401         }
402         else
403         {
404             return NULL;
405         }
406     }
407     return NULL;
408 }
409 
410 void* MemPool_calloc(uint32_t count,uint32_t size)
411 {
412     void* p =MemPool_malloc(count*size);
413     memset(p,0,count*size);
414     return p;
415 }
416 void MemPool_free(void* _Memory)
417 {
418     BlockInfo  blockinfo ;
419     if (_Memory == NULL)
420     {
421         return;
422     }
423     
424     blockinfo =  *( (BlockInfo*)((char*)_Memory - sizeof(BlockInfo)) );
425     if (blockinfo&FREED_BLOCK)//已经释放过(已是空闲chunk)
426     {
427         return;
428     }
429     *( (BlockInfo*)((char*)_Memory - sizeof(BlockInfo)) ) = (blockinfo)|(FREED_BLOCK);  
430     if( blockinfo & FIX_BLOCK)
431     {
432         MemBlock *pblock = NULL;
433         pblock = *( (MemBlock**)((char*)_Memory - CHUNK_HEAD_SIZE) ); //获取该chunk所在的block地址
434 
435         if (pblock->index <MAX_INDEX)
436         {//释放的chunk 挂到最前面,第一个可用的chunk
437             uint32_t chunk_id = pblock->nfirst;
438             char* poffset = ((char*)_Memory - sizeof(uint32_t)- sizeof(BlockInfo)) ;//chunk_id地址
439             pblock->nfirst =  * ( (uint32_t*)(poffset) );
440             * ( (uint32_t*)(poffset) ) = chunk_id ;
441             pblock->nfree++;
442             //memset(_Memory,0,CHUNK_DATA_SIZE(pblock->index));//数据区置0 
443 #ifdef MEM_ANALYSIS
444             {
445                 uint32_t used_chunk = 0;
446                 uint32_t i=pblock->index;
447                 Malloc_Free_check[i]--;
448                 //for (i=0;i<MAX_INDEX;i++)
449                 {
450                     MemBlock* pblock = NULL;
451                     pblock = mypool.freeblock[i];
452                     used_chunk = 0;
453                     do 
454                     {
455                         used_chunk += max_free_chunk[i]-pblock->nfree;
456                     }while (pblock=pblock->pNextBlock);
457                     if(used_chunk>max_used[i])
458                         max_used[i] = used_chunk;
459                 }
460             }        
461 #endif
462         }
463     }
464     else if (blockinfo & LARGE_BLOCK)
465     {
466         MemLargeBlock_free(_Memory);
467     }
468     else if (blockinfo & SYSTEM_BLOCK)
469     {
470         free( ((char*)_Memory - sizeof(BlockInfo)) );
471     }
472     
473 
474     
475 }
476 
477 GlobleLargeMem  myGloble;
478 
479 void GlobleLargeMem_Create(GlobleLargeMem* globle_mem,uint32_t iPicWith,uint32_t iPicHeght,uint32_t GOPsize,uint32_t MaxDecPicBuffering)
480 {
481     globle_mem->pLarge_size = 0;
482     globle_mem->pLarge_usedsize = 0;
483     globle_mem->pLarge_aligned_size = 0;
484     globle_mem->pLarge_aligned_usedsize = 0;
485 
486 
487   if( (globle_mem->pLarge = (char*)malloc(globle_mem->pLarge_size)) == NULL)
488   {
489       printf("memory malloc failed!\n");
490       exit(0);
491   }
492   memset(globle_mem->pLarge,0,globle_mem->pLarge_size);
493   if( (globle_mem->pLarge_aligned = (char*)malloc(globle_mem->pLarge_aligned_size)) == NULL)
494   {
495       printf("memory malloc failed!\n");
496       exit(0);
497   }
498   memset(globle_mem->pLarge_aligned,0,globle_mem->pLarge_aligned_size);
499 #ifdef MEM_ANALYSIS
500   printf("Globle large mem size        :%d byets,%d KB,%d M\n",globle_mem->pLarge_size,globle_mem->pLarge_size>>10,globle_mem->pLarge_size>>20);
501   printf("Globle large aligned mem size:%d byets,%d KB,%d M\n",globle_mem->pLarge_aligned_size,globle_mem->pLarge_aligned_size>>10,globle_mem->pLarge_aligned_size>>20);
502 #endif
503 }
504 
505 void GlobleLargeMem_Destory(GlobleLargeMem* globle_mem)
506 {
507 #ifdef MEM_ANALYSIS
508     printf("Globle large mem size        :%5d byets,%5d KB,%5d M Free:%5dbytes\n",globle_mem->pLarge_size,globle_mem->pLarge_size>>10,globle_mem->pLarge_size>>20,globle_mem->pLarge_size-globle_mem->pLarge_usedsize);
509     printf("Globle large aligned mem size:%5d byets,%5d KB,%5d M Free:%5dbytes\n",globle_mem->pLarge_aligned_size,globle_mem->pLarge_aligned_size>>10,globle_mem->pLarge_aligned_size>>20,globle_mem->pLarge_aligned_size-globle_mem->pLarge_aligned_usedsize);
510 #endif
511 
512     if (globle_mem->pLarge)
513     {
514         free(globle_mem->pLarge);
515         globle_mem->pLarge = NULL;
516     }
517     if (globle_mem->pLarge_aligned)
518     {
519         free(globle_mem->pLarge_aligned);
520         globle_mem->pLarge_aligned = NULL;
521     }    
522 }
523 
524 char* GlobleLargeMem_malloc(uint32_t size)
525 {
526     if (size<=(myGloble.pLarge_size - myGloble.pLarge_usedsize))
527     {
528         char *p = (char*)(myGloble.pLarge)+myGloble.pLarge_usedsize;
529         myGloble.pLarge_usedsize += size;
530         return p;
531     }
532     else
533     {
534         printf("Large_size memory is not enough!Need:%d bytes\n",size-(myGloble.pLarge_size - myGloble.pLarge_usedsize));
535         return NULL;
536     }
537 }
538 
539 char* GlobleLargeMem_Xmalloc(uint32_t size)
540 {
541     char *p  = (char*)(myGloble.pLarge_aligned)+myGloble.pLarge_aligned_usedsize;
542 #if     DATA_ALIGN 
543     uint32_t offset = ( 32 - p%32 )%32;
544 #else
545     uint32_t offset =0; 
546 #endif
547     size += offset;
548     if (size<=(myGloble.pLarge_aligned_size - myGloble.pLarge_aligned_usedsize))
549     {
550         myGloble.pLarge_aligned_usedsize += size;
551         return (p+offset);
552     }
553     else
554     {
555         printf("Largealigned_size memory is not enough!Need:%d bytes\n",size-(myGloble.pLarge_aligned_size - myGloble.pLarge_aligned_usedsize));
556         return NULL;
557     }
558 }
559 
560 void GlobleLargeMem_free(void *p)
561 {
562 
563 }
564 void GlobleLargeMem_Xfree(void *p)
565 {
566 
567 }
568 
569 
570 int main()
571 {
572     char* p1[10];
573     int i;
574     MemPool_create(&mypool,416,240);
575     for (i=0;i<6;i++)
576     {
577         p1[i]=(char*) MemPool_malloc(1024<<i);
578     }
579     for (i=0;i<6;i++)
580     {
581         MemPool_free(p1[i]);
582         p1[i] = NULL;   
583     }
584 
585     MemPool_destroy(&mypool);
586     return 0;
587 }
原文地址:https://www.cnblogs.com/mlj318/p/2540488.html