diff options
author | Matthew Hoops | 2011-07-20 09:27:39 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-07-20 09:27:39 -0400 |
commit | ad293b249e74dd1cfbdbd721d02145efbdaf9eca (patch) | |
tree | e568d96f6d7f64c5e58b4c7cd1c4fda7e649bfc7 /backends/plugins/elf/memory-manager.cpp | |
parent | d7411acc2b1c7702280dbff1c3e1bafee528184b (diff) | |
parent | e25e85fbb047fef895ede97c3c2c73451631052c (diff) | |
download | scummvm-rg350-ad293b249e74dd1cfbdbd721d02145efbdaf9eca.tar.gz scummvm-rg350-ad293b249e74dd1cfbdbd721d02145efbdaf9eca.tar.bz2 scummvm-rg350-ad293b249e74dd1cfbdbd721d02145efbdaf9eca.zip |
Merge remote branch 'upstream/master' into pegasus
Diffstat (limited to 'backends/plugins/elf/memory-manager.cpp')
-rw-r--r-- | backends/plugins/elf/memory-manager.cpp | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/backends/plugins/elf/memory-manager.cpp b/backends/plugins/elf/memory-manager.cpp index 39f5e9071d..058d818dc4 100644 --- a/backends/plugins/elf/memory-manager.cpp +++ b/backends/plugins/elf/memory-manager.cpp @@ -20,7 +20,7 @@ * */ -#include "common/scummsys.h" +#include "common/scummsys.h" #if defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) @@ -28,12 +28,14 @@ #include "common/debug.h" #include "common/util.h" #include <malloc.h> - -DECLARE_SINGLETON(ELFMemoryManager); -ELFMemoryManager::ELFMemoryManager() : - _heap(0), _heapSize(0), _heapAlign(0), - _trackAllocs(false), _measuredSize(0), _measuredAlign(0), +namespace Common { +DECLARE_SINGLETON(ELFMemoryManager); +} + +ELFMemoryManager::ELFMemoryManager() : + _heap(0), _heapSize(0), _heapAlign(0), + _trackAllocs(false), _measuredSize(0), _measuredAlign(0), _bytesAllocated(0) {} ELFMemoryManager::~ELFMemoryManager() { @@ -46,23 +48,23 @@ void ELFMemoryManager::trackPlugin(bool value) { if (value == _trackAllocs) return; - + _trackAllocs = value; - + if (_trackAllocs) { // start measuring // start tracking allocations _measuredAlign = 0; - + } else { // we're done measuring // get the total allocated size uint32 measuredSize = _allocList.back().end() - _allocList.front().start; _heapSize = MAX(_heapSize, measuredSize); _heapAlign = MAX(_heapAlign, _measuredAlign); - + _allocList.clear(); _bytesAllocated = 0; // reset - + debug(2, "measured a plugin of size %d. Max size %d. Max align %d", measuredSize, _heapSize, _heapAlign); } } @@ -70,7 +72,7 @@ void ELFMemoryManager::trackPlugin(bool value) { void ELFMemoryManager::trackAlloc(uint32 align, uint32 size) { if (!_measuredAlign) _measuredAlign = align; - + // use the allocate function to simulate allocation allocateOnHeap(align, size); } @@ -79,20 +81,20 @@ void ELFMemoryManager::allocateHeap() { // The memory manager should only allocate once assert (!_heap); assert (_heapSize); - + // clear the list _allocList.clear(); _bytesAllocated = 0; - + debug(2, "ELFMemoryManager: allocating %d bytes aligned at %d as the \ plugin heap", _heapSize, _heapAlign); - + // prepare the heap - if (_heapAlign) + if (_heapAlign) _heap = ::memalign(_heapAlign, _heapSize); else _heap = ::malloc(_heapSize); - + assert(_heap); } @@ -106,7 +108,7 @@ void *ELFMemoryManager::pluginAllocate(uint32 size) { void *ELFMemoryManager::pluginAllocate(uint32 align, uint32 size) { if (_heap) { return allocateOnHeap(align, size); - } + } return ::memalign(align, size); } @@ -120,16 +122,16 @@ void ELFMemoryManager::pluginDeallocate(void *ptr) { // Allocate space for the request in our heap void *ELFMemoryManager::allocateOnHeap(uint32 align, uint32 size) { byte *lastAddress = (byte *)_heap; - + // We can't allow allocations smaller than sizeof(Allocation). This could - // only be from non-plugin allocations and would cause infinite recursion + // only be from non-plugin allocations and would cause infinite recursion // when allocating our Allocation in the list. if (size <= sizeof(Allocation)) return 0; - + Common::List<Allocation>::iterator i; for (i = _allocList.begin(); i != _allocList.end(); i++) { - if (i->start - lastAddress > (int)size) + if (i->start - lastAddress > (int)size) break; lastAddress = i->end(); // align to desired alignment @@ -137,20 +139,20 @@ void *ELFMemoryManager::allocateOnHeap(uint32 align, uint32 size) { lastAddress = (byte *)( ((uint32)lastAddress + align - 1) & ~(align - 1) ); } } - + // Check if we exceeded our heap limit // We skip this case if we're only tracking allocations if (!_trackAllocs && ((uint32)lastAddress + size > (uint32)_heap + _heapSize)) { debug(2, "failed to find space to allocate %d bytes", size); return 0; } - + _allocList.insert(i, Allocation(lastAddress, size)); _bytesAllocated += size; - - debug(7, "ELFMemoryManager: allocated %d bytes at %p. Total %d bytes", + + debug(7, "ELFMemoryManager: allocated %d bytes at %p. Total %d bytes", size, lastAddress, _bytesAllocated); - + return lastAddress; } @@ -159,14 +161,14 @@ void ELFMemoryManager::deallocateFromHeap(void *ptr) { for (i = _allocList.begin(); i != _allocList.end(); i++) { if (i->start == ptr) { _bytesAllocated -= (*i).size; - - debug(7, "ELFMemoryManager: freed %d bytes at %p. Total %d bytes", + + debug(7, "ELFMemoryManager: freed %d bytes at %p. Total %d bytes", (*i).size, (*i).start, _bytesAllocated); - + _allocList.erase(i); break; } - } + } } #endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) */ |