00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef MF_MEMPOOL_H
00028 #define MF_MEMPOOL_H
00029
00030 #ifndef NULL
00031 const int NULL=0;
00032 #endif
00033
00034 #define MP_BLOCK_SIZE 1000000
00035
00036 #include <iostream>
00037
00039
00044 class memnode
00045 {
00046 friend class mempool;
00047 friend class strstack;
00048 char *block;
00049 memnode *next;
00050 };
00051
00052
00054
00061 class mempool
00062 {
00063 int block_size;
00064 int item_size;
00065 int true_size;
00066 memnode* block_list;
00067 char* free_list;
00068 int entries;
00069 int blocknum;
00070 public:
00071
00073 mempool(int is, int bs=MP_BLOCK_SIZE);
00074
00076 ~mempool();
00077
00079 void map(std::ostream& co);
00080
00082 char *allocate();
00083
00085 int free(char* addr);
00086
00088 void stat();
00089
00091
00093 int used() {
00094 return blocknum * (true_size + 8);
00095 }
00096
00098 int wasted() {
00099 return used()-(entries * item_size);
00100 }
00101 };
00102
00104
00112 class strstack
00113 {
00114 memnode* list;
00115 int size;
00116 int idx;
00117 int waste;
00118 int memory;
00119 int entries;
00120 int blocknum;
00121
00122 public:
00123
00124 strstack(int bs=1000);
00125
00126 ~strstack();
00127
00128 const char *push(const char *s);
00129
00130 const char *pop();
00131
00132 const char *top();
00133
00134 void stat();
00135
00136 int used() {
00137 return memory;
00138 }
00139
00140 int wasted() {
00141 return waste;
00142 }
00143
00144 };
00145
00146
00148
00157 class storage
00158 {
00159 mempool **poolset;
00160 int setsize;
00161 int poolsize;
00162 int newmemory;
00163 int newcalls;
00164 public:
00165
00167 storage(int maxsize,int blocksize);
00168
00170 ~storage();
00171
00172
00173
00175 char *allocate(int size);
00176
00178 char *reallocate(char *oldptr,int oldsize,int newsize);
00179
00181 int free(char *addr,int size=0);
00182
00184 void stat();
00185 };
00186
00187 #endif