00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef NEVERFREEMEMORY_H
00016 #define NEVERFREEMEMORY_H
00017
00018 #include "dtoolbase.h"
00019
00020 #include "mutexImpl.h"
00021 #include <set>
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 class EXPCL_DTOOL NeverFreeMemory {
00038 private:
00039 NeverFreeMemory();
00040
00041 public:
00042 INLINE static void *alloc(size_t size);
00043
00044 PUBLISHED:
00045 INLINE static size_t get_total_alloc();
00046 INLINE static size_t get_total_used();
00047 INLINE static size_t get_total_unused();
00048
00049 private:
00050 void *ns_alloc(size_t size);
00051 INLINE static NeverFreeMemory *get_global_ptr();
00052 static void make_global_ptr();
00053
00054 private:
00055 class Page {
00056 public:
00057 INLINE Page(void *start, size_t size);
00058 INLINE bool operator < (const Page &other) const;
00059 INLINE void *alloc(size_t size);
00060
00061 unsigned char *_next;
00062 size_t _remaining;
00063 };
00064
00065 typedef set<Page> Pages;
00066 Pages _pages;
00067
00068 size_t _total_alloc;
00069 size_t _total_used;
00070 MutexImpl _lock;
00071 static NeverFreeMemory * TVOLATILE _global_ptr;
00072 };
00073
00074 #include "neverFreeMemory.I"
00075
00076 #endif