1#include <stdlib.h> 2#include <string.h> 3#include <stdio.h> 4#include <time.h> 5#include "mem_pool.h" 6 7static list_node *available[LIST_NUM]; 8static list_node *rear[LIST_NUM]; 9 10static manager_node manager_list[LIST_NUM]; 11static list_node list_16_node[NODE_NUM]; 12static list_node list_64_node[NODE_NUM]; 13 14typedef list_node* (*init_ptr) (list_node **); 15 16list_node * sixteen_init(list_node **last) 17{ 18 void *a = malloc(16*NODE_NUM); 19 //printf("the list16 start addr is %x\n",(int)a); 20 int i; 21 assert_param(a); 22 for(i=0;i<NODE_NUM;i++) 23 { 24 list_16_node[i].addr=a+i*16; 25 list_16_node[i].next_node=NULL; 26 //printf("the list %d addr is %x\n",i,(int)(list_16_node[i].addr)); 27 if(i==NODE_NUM-1) 28 break; 29 list_16_node[i].next_node=&list_16_node[i+1]; 30 } 31 *last=&(list_16_node[i]); 32 //printf("the list16 node %dend addr is %x\n\n",i,(int)(list_16_node[i].addr)); 33 return (&list_16_node[0]); 34} 35 36list_node * sixtyfour_init(list_node **last) 37{ 38 void *a = malloc(64*NODE_NUM); 39 //printf("the list64 start addr is %x\n",(int)a); 40 int i; 41 assert_param(a); 42 for(i=0;i<NODE_NUM;i++) 43 { 44 list_64_node[i].addr=a+i*64; 45 list_64_node[i].next_node=NULL; 46 //printf("the list %d addr is %x\n",i,(int)(list_16_node[i].addr)); 47 if(i==NODE_NUM-1) 48 break; 49 list_64_node[i].next_node=&list_64_node[i+1]; 50 } 51 *last=&(list_64_node[i]); 52 //printf("the list64 node %dend addr is %x\n\n",i,(int)(list_64_node[i].addr)); 53 return (&list_64_node[0]); 54} 55 56static init_ptr func_ptr[]= 57{ 58 sixteen_init, 59 sixtyfour_init, 60}; 61 62int mem_pool_init() 63{ 64 int i; 65 for(i=0;i<LIST_NUM;i++) 66 { 67 available[i]=(*func_ptr[i])(&(rear[i])); 68 } 69 for(i=0;i<LIST_NUM;i++) 70 { 71 manager_list[i].start_node=available[i]; 72 manager_list[i].last_node=rear[i]; 73 manager_list[i].addr_start=(unsigned int)(available[i]->addr); 74 manager_list[i].addr_end=(unsigned int)(manager_list[i].last_node->addr); 75 //printf("the manager_list[%d] \tstart addr is%x and end addr is %x\n\n",i,(unsigned int)(unsigned int)(manager_list[i].start_node->addr),(unsigned int)(manager_list[i].last_node->addr)); 76 } 77 78 return 0; 79} 80 81 82void * mem_alloc(int num) 83{ 84 printf("malloc num=%d\n",num); 85 int i; 86 if(num>=1&&num<=16) 87 i=0; 88 else if(num>=9&&num<=64) 89 i=1; 90 else 91 return (malloc(num)); 92 if(manager_list[i].start_node == NULL) 93 { 94 printf("this is no space in mempool!!\n"); 95 return (malloc(num)); 96 } 97 98 list_node *p=manager_list[i].start_node; 99 manager_list[i].start_node = manager_list[i].start_node->next_node; 100 //p->next_node=NULL; //alan deleted 101 102 return (p->addr); 103} 104 105 106void mem_free(void *addr) 107{ 108 if(addr==NULL) 109 return ; 110 int i; 111 unsigned int num=(unsigned int)(addr); 112 unsigned int start_addr,end_addr; 113 for(i=0;i<LIST_NUM;i++) 114 { 115 start_addr=(unsigned int)available[i]->addr; 116 end_addr=(unsigned int)rear[i]->addr; 117 if(num>=start_addr&&num<=end_addr) 118 break; 119 } 120// printf("the free add is %x and the start addr is %x\n",num,start_addr); 121 if(i>=LIST_NUM) //alan add 122 { 123 free(addr); 124 return; 125 } 126 127 //num=(num-start_addr)/(16*(i+1)); 128 if(i == 0) //alan add 129 { 130 num=(num-start_addr)/16; 131 } 132 else if(i == 1) 133 { 134 num=(num-start_addr)/64; 135 136 } 137 138 if(num>NODE_NUM) 139 { 140 free(addr); 141 return; 142 } 143// printf("the free node is %d\tand is nodelist[%d]\n",num,i); 144 switch(i) 145 { 146 case 0: 147// printf("list_16_node[%d] the next is %x\n",num,list_16_node[num].next_node); 148 list_16_node[num].next_node=manager_list[i].start_node; 149 manager_list[i].start_node=&(list_16_node[num]); 150 break; 151 case 1: 152// printf("list_16_node[%d] the next is %x\n",num,list_16_node[num].next_node); 153 list_64_node[num].next_node=manager_list[i].start_node; 154 manager_list[i].start_node=&(list_64_node[num]); 155 break; 156 default: 157 free(addr); 158 break; 159 } 160} 161 162void mem_pool_destroy() 163{ 164 int i; 165 for(i=0;i<LIST_NUM;i++) 166 { 167 free(available[i]->addr); 168 } 169} 170