00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 INLINE void *NeverFreeMemory::
00023 alloc(size_t size) {
00024 return get_global_ptr()->ns_alloc(size);
00025 }
00026
00027
00028
00029
00030
00031
00032
00033 INLINE size_t NeverFreeMemory::
00034 get_total_alloc() {
00035 return get_global_ptr()->_total_alloc;
00036 }
00037
00038
00039
00040
00041
00042
00043
00044 INLINE size_t NeverFreeMemory::
00045 get_total_used() {
00046 return get_global_ptr()->_total_used;
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 INLINE size_t NeverFreeMemory::
00058 get_total_unused() {
00059 NeverFreeMemory *global_ptr = get_global_ptr();
00060 global_ptr->_lock.acquire();
00061 size_t total_unused = global_ptr->_total_alloc - global_ptr->_total_used;
00062 global_ptr->_lock.release();
00063 return total_unused;
00064 }
00065
00066
00067
00068
00069
00070
00071 INLINE NeverFreeMemory *NeverFreeMemory::
00072 get_global_ptr() {
00073 if (_global_ptr == (NeverFreeMemory *)NULL) {
00074 make_global_ptr();
00075 }
00076 return _global_ptr;
00077 }
00078
00079
00080
00081
00082
00083
00084 INLINE NeverFreeMemory::Page::
00085 Page(void *start, size_t size) :
00086 _next((unsigned char *)start),
00087 _remaining(size)
00088 {
00089 }
00090
00091
00092
00093
00094
00095
00096 INLINE bool NeverFreeMemory::Page::
00097 operator < (const NeverFreeMemory::Page &other) const {
00098 return _remaining < other._remaining;
00099 }
00100
00101
00102
00103
00104
00105
00106 INLINE void *NeverFreeMemory::Page::
00107 alloc(size_t size) {
00108 assert(size <= _remaining);
00109 void *result = _next;
00110 _next += size;
00111 _remaining -= size;
00112 return result;
00113 }