114 lines
4.0 KiB
Plaintext
114 lines
4.0 KiB
Plaintext
// Filename: neverFreeMemory.I
|
|
// Created by: drose (14Jun07)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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."
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::alloc
|
|
// Access: Public, Static
|
|
// Description: Returns a pointer to a newly-allocated block of
|
|
// memory of the indicated size.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void *NeverFreeMemory::
|
|
alloc(size_t size) {
|
|
return get_global_ptr()->ns_alloc(size);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::get_total_alloc
|
|
// Access: Published, Static
|
|
// Description: 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;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::get_total_used
|
|
// Access: Published, Static
|
|
// Description: 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;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::get_total_unused
|
|
// Access: Published, Static
|
|
// Description: 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.release();
|
|
return total_unused;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::get_global_ptr
|
|
// Access: Private, Static
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE NeverFreeMemory *NeverFreeMemory::
|
|
get_global_ptr() {
|
|
if (_global_ptr == (NeverFreeMemory *)NULL) {
|
|
make_global_ptr();
|
|
}
|
|
return _global_ptr;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::Page::Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE NeverFreeMemory::Page::
|
|
Page(void *start, size_t size) :
|
|
_next((unsigned char *)start),
|
|
_remaining(size)
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::Page::operator <
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool NeverFreeMemory::Page::
|
|
operator < (const NeverFreeMemory::Page &other) const {
|
|
return _remaining < other._remaining;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: NeverFreeMemory::Page::alloc
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void *NeverFreeMemory::Page::
|
|
alloc(size_t size) {
|
|
assert(size <= _remaining);
|
|
void *result = _next;
|
|
_next += size;
|
|
_remaining -= size;
|
|
return result;
|
|
}
|