historical/toontown-classic.git/panda/include/neverFreeMemory.I
2024-01-16 11:20:27 -06:00

96 lines
2 KiB
Text

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file neverFreeMemory.I
* @author drose
* @date 2007-06-14
*/
/**
* Returns a pointer to a newly-allocated block of memory of the indicated
* size.
*
* Please note that the resulting pointer is not aligned to any boundary.
*/
INLINE void *NeverFreeMemory::
alloc(size_t size) {
return get_global_ptr()->ns_alloc(size);
}
/**
* Returns the total number of bytes consumed by all the pages allocated
* internally by this object.
*/
INLINE size_t NeverFreeMemory::
get_total_alloc() {
return get_global_ptr()->_total_alloc;
}
/**
* Returns the total number of bytes requested by the application in calls to
* NeverFreeMemory::alloc().
*/
INLINE size_t NeverFreeMemory::
get_total_used() {
return get_global_ptr()->_total_used;
}
/**
* Returns the difference between get_total_alloc() and get_total_used().
* This represents bytes in allocated pages that have not (yet) been used by
* the application.
*/
INLINE size_t NeverFreeMemory::
get_total_unused() {
NeverFreeMemory *global_ptr = get_global_ptr();
global_ptr->_lock.lock();
size_t total_unused = global_ptr->_total_alloc - global_ptr->_total_used;
global_ptr->_lock.unlock();
return total_unused;
}
/**
*
*/
INLINE NeverFreeMemory *NeverFreeMemory::
get_global_ptr() {
if (_global_ptr == nullptr) {
make_global_ptr();
}
return _global_ptr;
}
/**
*
*/
INLINE NeverFreeMemory::Page::
Page(void *start, size_t size) :
_next((unsigned char *)start),
_remaining(size)
{
}
/**
*
*/
INLINE bool NeverFreeMemory::Page::
operator < (const NeverFreeMemory::Page &other) const {
return _remaining < other._remaining;
}
/**
*
*/
INLINE void *NeverFreeMemory::Page::
alloc(size_t size) {
assert(size <= _remaining);
void *result = _next;
_next += size;
_remaining -= size;
return result;
}