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