00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00030 #ifndef _UCOMMON_MEMORY_H_
00031 #define _UCOMMON_MEMORY_H_
00032
00033 #ifndef _UCOMMON_LINKED_H_
00034 #include <ucommon/linked.h>
00035 #endif
00036
00037 NAMESPACE_UCOMMON
00038
00039 class PagerPool;
00040
00048 class __EXPORT memalloc
00049 {
00050 private:
00051 size_t pagesize, align;
00052 unsigned count;
00053
00054 typedef struct mempage {
00055 struct mempage *next;
00056 union {
00057 void *memalign;
00058 unsigned used;
00059 };
00060 } page_t;
00061
00062 page_t *page;
00063
00064 protected:
00065 unsigned limit;
00066
00071 page_t *pager(void);
00072
00073 public:
00078 memalloc(size_t page = 0);
00079
00083 virtual ~memalloc();
00084
00089 inline unsigned getPages(void)
00090 {return count;};
00091
00099 inline unsigned getLimit(void)
00100 {return limit;};
00101
00106 inline unsigned getAlloc(void)
00107 {return pagesize;};
00108
00119 unsigned utilization(void);
00120
00124 void purge(void);
00125
00132 virtual void *alloc(size_t size);
00133
00141 void *zalloc(size_t size);
00142
00148 char *dup(const char *string);
00149
00156 void *dup(void *memory, size_t size);
00157 };
00158
00179 class __EXPORT mempager : public memalloc
00180 {
00181 private:
00182 pthread_mutex_t mutex;
00183
00184 public:
00189 mempager(size_t page = 0);
00190
00194 virtual ~mempager();
00195
00202 inline void lock(void)
00203 {pthread_mutex_lock(&mutex);};
00204
00208 inline void unlock(void)
00209 {pthread_mutex_unlock(&mutex);};
00210
00221 unsigned utilization(void);
00222
00226 void purge(void);
00227
00235 virtual void dealloc(void *memory);
00236
00244 void *alloc(size_t size);
00245
00254 void *zalloc(size_t size);
00255
00262 char *dup(const char *string);
00263
00271 void *dup(void *memory, size_t size);
00272 };
00273
00281 class __EXPORT autorelease
00282 {
00283 private:
00284 LinkedObject *pool;
00285
00286 public:
00290 autorelease();
00291
00295 ~autorelease();
00296
00302 void release(void);
00303
00308 void operator+=(LinkedObject *object);
00309 };
00310
00321 class __EXPORT PagerObject : public LinkedObject, public CountedObject
00322 {
00323 protected:
00324 friend class PagerPool;
00325
00326 PagerPool *pager;
00327
00331 PagerObject();
00332
00336 void release(void);
00337
00341 void dealloc(void);
00342 };
00343
00349 class __EXPORT PagerPool
00350 {
00351 private:
00352 mempager *pager;
00353 LinkedObject *freelist;
00354 pthread_mutex_t mutex;
00355
00356 protected:
00357 PagerPool(mempager *pager);
00358 ~PagerPool();
00359
00360 PagerObject *get(size_t size);
00361
00362 public:
00367 void put(PagerObject *object);
00368 };
00369
00381 class __EXPORT keyassoc : protected mempager
00382 {
00383 private:
00387 class __LOCAL keydata : public NamedObject
00388 {
00389 public:
00390 void *data;
00391 char text[8];
00392
00393 keydata(keyassoc *assoc, char *id, unsigned max, unsigned bufsize);
00394 };
00395
00396 friend class keydata;
00397
00398 unsigned count;
00399 unsigned paths;
00400 size_t keysize;
00401 NamedObject **root;
00402 LinkedObject **list;
00403
00404 public:
00411 keyassoc(unsigned indexing = 177, size_t max = 0, size_t page = 0);
00412
00416 ~keyassoc();
00417
00422 inline unsigned getCount(void)
00423 {return count;};
00424
00430 inline void *operator()(const char *name)
00431 {return locate(name);};
00432
00436 void purge(void);
00437
00443 void *locate(const char *name);
00444
00452 bool assign(char *name, void *pointer);
00453
00460 bool create(char *name, void *pointer);
00461
00468 void *remove(const char *name);
00469 };
00470
00478 template <class T, unsigned I = 177, size_t M = 0, size_t P = 0>
00479 class assoc_pointer : private keyassoc
00480 {
00481 public:
00485 inline assoc_pointer() : keyassoc(I, M, P) {};
00486
00491 inline unsigned getCount(void)
00492 {return keyassoc::getCount();};
00493
00497 inline void purge(void)
00498 {keyassoc::purge();};
00499
00505 inline T *locate(const char *name)
00506 {return static_cast<T*>(keyassoc::locate(name));};
00507
00513 inline T *operator()(const char *name)
00514 {return locate(name);};
00515
00523 inline bool assign(char *name, T *pointer)
00524 {return keyassoc::assign(name, pointer);};
00525
00532 inline bool create(char *name, T *pointer)
00533 {return keyassoc::create(name, pointer);};
00534
00540 inline void remove(char *name)
00541 {keyassoc::remove(name);};
00542
00548 inline unsigned utilization(void)
00549 {return mempager::utilization();};
00550
00557 inline unsigned getPages(void)
00558 {return mempager::getPages();};
00559 };
00560
00567 template <class T>
00568 class pager : private PagerPool
00569 {
00570 public:
00575 inline pager(mempager *heap = NULL) : PagerPool(heap) {};
00576
00580 inline ~pager()
00581 {mempager::purge();};
00582
00587 inline T *operator()(void)
00588 {return new(get(sizeof(T))) T;};
00589
00594 inline T *operator*()
00595 {return new(get(sizeof(T))) T;};
00596 };
00597
00598 END_NAMESPACE
00599
00600 #endif