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
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef _ARENA_H_
00053 #define _ARENA_H_
00054
00055 #include <cstddef>
00056 #ifdef ENABLE_MEMORY_TRACKING
00057 #include <list>
00058
00059 class Arena;
00060 typedef std::list<Arena*> ArenaList;
00061 #endif
00062
00063
00070 class Arena
00071 {
00072 public:
00074
00077 Arena();
00078
00080
00083 virtual ~Arena();
00084
00089 virtual void* alloc(size_t a_sz) = 0;
00090
00094 virtual void free(void* a_pt) = 0;
00095
00102 static size_t align(size_t a_sz);
00103
00104 typedef void (*FP)();
00105
00106 #ifdef ENABLE_MEMORY_TRACKING
00107
00110 long int bytes;
00111 long int peak;
00112 static ArenaList* arenaList_;
00113 char name_[120];
00115 #endif
00116
00117
00118 protected:
00119
00120
00121
00122 #ifndef DOXYGEN
00123
00124 union Word
00125 {
00126 void* p;
00127 double d;
00128 long l;
00129 FP f;
00130 };
00131 #endif
00132 };
00133
00134
00135
00136
00137
00138 inline size_t Arena::align (size_t a_s)
00139 {
00140 size_t x = a_s + sizeof(Word) - 1;
00141 x -= x % sizeof(Word);
00142 return x;
00143 }
00144
00146
00153 class BArena: public Arena
00154 {
00155 public:
00157
00161 BArena(const char* a_name = "unnamed");
00162
00166 virtual void* alloc (size_t a_sz);
00167
00169 virtual void free (void* a_pt);
00170 };
00171
00172 #include <cstddef>
00173 #include <set>
00174 #include <vector>
00175 using std::set;
00176
00178
00185 class CArena: public Arena
00186 {
00187 public:
00192 CArena(size_t a_hunk_size = 0);
00193
00195 virtual ~CArena();
00196
00198 virtual void* alloc(size_t a_nbytes);
00199
00203 virtual void free(void* a_vp);
00204
00209 void* calloc(size_t a_nmemb,
00210 size_t a_size);
00211
00216 void* realloc (void* a_ptr,
00217 size_t a_size);
00218
00220 enum { DefaultHunkSize = 1024*1024 };
00221
00222
00223 protected:
00224
00225
00226
00227 #ifndef DOXYGEN
00228 class Node
00229 {
00230 public:
00231
00232
00233
00234 Node()
00235 :
00236 m_block(0),
00237 m_size(0)
00238 {}
00239
00240
00241
00242 Node(void* a_block, size_t a_size)
00243 :
00244 m_block(a_block),
00245 m_size(a_size)
00246 {}
00247
00248
00249
00250 Node(const Node& a_rhs)
00251 :
00252 m_block(a_rhs.m_block),
00253 m_size(a_rhs.m_size)
00254 {}
00255
00256
00257
00258 Node& operator = (const Node& a_rhs)
00259 {
00260 m_block = a_rhs.m_block;
00261 m_size = a_rhs.m_size;
00262 return *this;
00263 }
00264
00265
00266
00267 bool operator < (const Node& a_rhs) const
00268 {
00269 return m_block < a_rhs.m_block;
00270 }
00271
00272
00273
00274 bool operator == (const Node& a_rhs) const
00275 {
00276 return m_block == a_rhs.m_block;
00277 }
00278
00279
00280
00281 void* block() const
00282 {
00283 return m_block;
00284 }
00285
00286
00287
00288 void block (void* a_blk)
00289 {
00290 m_block = a_blk;
00291 }
00292
00293
00294
00295 size_t size() const
00296 {
00297 return m_size;
00298 }
00299
00300
00301
00302 void size(size_t a_sz)
00303 {
00304 m_size = a_sz;
00305 }
00306
00307
00308 private:
00309
00310
00311
00312 void* m_block;
00313
00314
00315
00316 size_t m_size;
00317 };
00318
00319
00320
00321
00322
00323 typedef set < Node > NL;
00324
00325
00326
00327
00328 std::vector<void*> m_alloc;
00329
00330
00331
00332
00333
00334 NL m_freelist;
00335
00336
00337
00338
00339
00340 NL m_busylist;
00341
00342
00343
00344
00345 size_t m_hunk;
00346 #endif
00347
00348
00349 private:
00350
00351
00352
00353 CArena (const CArena& a_rhs);
00354 CArena& operator= (const CArena& a_rhs);
00355 };
00356
00357
00358
00359
00360 extern Arena* The_FAB_Arena;
00361
00362 #endif