00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _ARENA_H_
00012 #define _ARENA_H_
00013
00014 #include <cstddef>
00015
00016 #ifdef CH_USE_MEMORY_TRACKING
00017 #include <list>
00018 #include <cstddef>
00019 #endif
00020
00021 #include <set>
00022 #include <vector>
00023 #include "BaseNamespaceHeader.H"
00024
00025 #ifdef CH_USE_MEMORY_TRACKING
00026 class Arena;
00027 typedef std::list<Arena*> ArenaList;
00028 #endif
00029
00030 using std::set;
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 class Arena
00041 {
00042 public:
00043
00044
00045
00046
00047 Arena();
00048
00049
00050
00051
00052
00053 virtual ~Arena();
00054
00055
00056
00057
00058
00059 virtual void* alloc(size_t a_sz) = 0;
00060
00061
00062
00063
00064 virtual void free(void* a_pt) = 0;
00065
00066
00067
00068
00069
00070
00071
00072 static size_t align(size_t a_sz);
00073
00074 typedef void (*FP)();
00075
00076 #ifdef CH_USE_MEMORY_TRACKING
00077
00078
00079
00080 long int bytes;
00081 long int peak;
00082 static ArenaList* arenaList_;
00083 static int NSIZE;
00084 char name_[120];
00085
00086 #endif
00087
00088
00089 protected:
00090
00091
00092
00093 #ifndef DOXYGEN
00094
00095 union Word
00096 {
00097 void* p;
00098 double d;
00099 long l;
00100 FP f;
00101 };
00102 #endif
00103 };
00104
00105
00106
00107
00108
00109 inline size_t Arena::align (size_t a_s)
00110 {
00111 size_t x = a_s + sizeof(Word) - 1;
00112 x -= x % sizeof(Word);
00113 return x;
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 class BArena: public Arena
00125 {
00126 public:
00127
00128
00129
00130
00131
00132 BArena(const char* a_name = "unnamed");
00133
00134 BArena(const std::string& a_name);
00135
00136
00137
00138
00139 virtual void* alloc (size_t a_sz);
00140
00141
00142 virtual void free (void* a_pt);
00143 };
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 class CArena: public Arena
00154 {
00155 public:
00156
00157
00158
00159
00160 CArena(size_t a_hunk_size = 0);
00161
00162
00163 virtual ~CArena();
00164
00165
00166 virtual void* alloc(size_t a_nbytes);
00167
00168
00169
00170
00171 virtual void free(void* a_vp);
00172
00173 #if 0
00174
00175
00176
00177
00178 void* calloc(size_t a_nmemb,
00179 size_t a_size);
00180
00181
00182
00183
00184
00185 void* realloc (void* a_ptr,
00186 size_t a_size);
00187 #endif
00188
00189
00190 enum
00191 {
00192 DefaultHunkSize = 1024*1024
00193 };
00194
00195
00196 protected:
00197
00198
00199
00200 #ifndef DOXYGEN
00201 class Node
00202 {
00203 public:
00204
00205
00206
00207 Node()
00208 :
00209 m_block(0),
00210 m_size(0)
00211 {}
00212
00213
00214
00215 Node(void* a_block, size_t a_size)
00216 :
00217 m_block(a_block),
00218 m_size(a_size)
00219 {}
00220
00221
00222
00223 Node(const Node& a_rhs)
00224 :
00225 m_block(a_rhs.m_block),
00226 m_size(a_rhs.m_size)
00227 {}
00228
00229
00230
00231 Node& operator = (const Node& a_rhs)
00232 {
00233 m_block = a_rhs.m_block;
00234 m_size = a_rhs.m_size;
00235 return *this;
00236 }
00237
00238
00239
00240 bool operator < (const Node& a_rhs) const
00241 {
00242 return m_block < a_rhs.m_block;
00243 }
00244
00245
00246
00247 bool operator == (const Node& a_rhs) const
00248 {
00249 return m_block == a_rhs.m_block;
00250 }
00251
00252
00253
00254 void* block() const
00255 {
00256 return m_block;
00257 }
00258
00259
00260
00261 void block (void* a_blk)
00262 {
00263 m_block = a_blk;
00264 }
00265
00266
00267
00268 size_t size() const
00269 {
00270 return m_size;
00271 }
00272
00273
00274
00275 void size(size_t a_sz)
00276 {
00277 m_size = a_sz;
00278 }
00279
00280 private:
00281
00282
00283
00284 void* m_block;
00285
00286
00287
00288 size_t m_size;
00289 };
00290
00291
00292
00293
00294
00295 typedef set < Node > NL;
00296
00297
00298
00299
00300 std::vector<void*> m_alloc;
00301
00302
00303
00304
00305
00306 NL m_freelist;
00307
00308
00309
00310
00311
00312 NL m_busylist;
00313
00314
00315
00316
00317 size_t m_hunk;
00318 #endif
00319
00320
00321 private:
00322
00323
00324
00325 CArena (const CArena& a_rhs);
00326 CArena& operator= (const CArena& a_rhs);
00327 };
00328
00329
00330
00331
00332 extern Arena* The_FAB_Arena;
00333
00334 #include "BaseNamespaceFooter.H"
00335 #endif