diff options
-rw-r--r-- | common/hashmap.h | 20 | ||||
-rw-r--r-- | common/memorypool.cpp | 117 | ||||
-rw-r--r-- | common/memorypool.h | 30 |
3 files changed, 83 insertions, 84 deletions
diff --git a/common/hashmap.h b/common/hashmap.h index f794fbe405..36e032625e 100644 --- a/common/hashmap.h +++ b/common/hashmap.h @@ -107,19 +107,19 @@ public: #ifdef USE_HASHMAP_MEMORY_POOL - MemoryPool _nodePool; + MemoryPool _nodePool; Node *allocNode(const Key& key) { - void* mem = _nodePool.malloc(); - return new (mem) Node(key); + void* mem = _nodePool.malloc(); + return new (mem) Node(key); } void freeNode(Node* node) { - node->~Node(); - _nodePool.free(node); + node->~Node(); + _nodePool.free(node); } #else - Node* allocNode(const Key& key) { + Node* allocNode(const Key& key) { return new Node(key); } @@ -352,9 +352,9 @@ public: template <class Key, class Val, class HashFunc, class EqualFunc> HashMap<Key, Val, HashFunc, EqualFunc>::HashMap() : #ifdef USE_HASHMAP_MEMORY_POOL - _nodePool(sizeof(Node)), + _nodePool(sizeof(Node)), #endif - _defaultVal() { + _defaultVal() { _arrsize = nextTableSize(0); _arr = new Node *[_arrsize]; assert(_arr != NULL); @@ -376,9 +376,9 @@ HashMap<Key, Val, HashFunc, EqualFunc>::HashMap() : template <class Key, class Val, class HashFunc, class EqualFunc> HashMap<Key, Val, HashFunc, EqualFunc>::HashMap(const HM_t& map) : #ifdef USE_HASHMAP_MEMORY_POOL - _nodePool(sizeof(Node)), + _nodePool(sizeof(Node)), #endif - _defaultVal() { + _defaultVal() { assign(map); } diff --git a/common/memorypool.cpp b/common/memorypool.cpp index efce832e3d..6eab758c11 100644 --- a/common/memorypool.cpp +++ b/common/memorypool.cpp @@ -32,92 +32,91 @@ namespace Common static const size_t CHUNK_PAGE_SIZE = 32; void* MemoryPool::allocPage() { - void* result = ::malloc(CHUNK_PAGE_SIZE * _chunkSize); - _pages.push_back(result); - void* current = result; - for(size_t i=1; i<CHUNK_PAGE_SIZE; ++i) - { - void* next = ((char*)current + _chunkSize); - *(void**)current = next; - - current = next; - } - *(void**)current = NULL; - return result; + void* result = ::malloc(CHUNK_PAGE_SIZE * _chunkSize); + _pages.push_back(result); + void* current = result; + for(size_t i=1; i<CHUNK_PAGE_SIZE; ++i) { + void* next = ((char*)current + _chunkSize); + *(void**)current = next; + + current = next; + } + *(void**)current = NULL; + return result; } MemoryPool::MemoryPool(size_t chunkSize) { - // You must at least fit the pointer in the node (technically unneeded considering the next rounding statement) - _chunkSize = MAX(chunkSize, sizeof(void*)); - // There might be an alignment problem on some platforms when trying to load a void* on a non natural boundary - // so we round to the next sizeof(void*) - _chunkSize = (_chunkSize + sizeof(void*) - 1) & (~(sizeof(void*) - 1)); + // You must at least fit the pointer in the node (technically unneeded considering the next rounding statement) + _chunkSize = MAX(chunkSize, sizeof(void*)); + // There might be an alignment problem on some platforms when trying to load a void* on a non natural boundary + // so we round to the next sizeof(void*) + _chunkSize = (_chunkSize + sizeof(void*) - 1) & (~(sizeof(void*) - 1)); - _next = NULL; + _next = NULL; } MemoryPool::~MemoryPool() { - for(size_t i=0; i<_pages.size(); ++i) - ::free(_pages[i]); + for(size_t i=0; i<_pages.size(); ++i) + ::free(_pages[i]); } void* MemoryPool::malloc() { #if 1 - if(!_next) - _next = allocPage(); + if(!_next) + _next = allocPage(); - void* result = _next; - _next = *(void**)result; - return result; + void* result = _next; + _next = *(void**)result; + return result; #else - return ::malloc(_chunkSize); + return ::malloc(_chunkSize); #endif } void MemoryPool::free(void* ptr) { #if 1 - *(void**)ptr = _next; - _next = ptr; + *(void**)ptr = _next; + _next = ptr; #else - ::free(ptr); + ::free(ptr); #endif } // Technically not compliant C++ to compare unrelated pointers. In practice... bool MemoryPool::isPointerInPage(void* ptr, void* page) { - return (ptr >= page) && (ptr < (char*)page + CHUNK_PAGE_SIZE * _chunkSize); + return (ptr >= page) && (ptr < (char*)page + CHUNK_PAGE_SIZE * _chunkSize); } void MemoryPool::freeUnusedPages() { - //std::sort(_pages.begin(), _pages.end()); - Array<size_t> numberOfFreeChunksPerPage; - numberOfFreeChunksPerPage.resize(_pages.size()); - for(size_t i=0; i<numberOfFreeChunksPerPage.size(); ++i) { - numberOfFreeChunksPerPage[i] = 0; - } - - void* iterator = _next; - while(iterator) { - // This should be a binary search - for(size_t i=0; i<_pages.size(); ++i) { - if(isPointerInPage(iterator, _pages[i])) { - ++numberOfFreeChunksPerPage[i]; - break; - } - } - iterator = *(void**)iterator; - } - - size_t freedPagesCount = 0; - for(size_t i=0; i<_pages.size(); ++i) { - if(numberOfFreeChunksPerPage[i] == CHUNK_PAGE_SIZE) { - ::free(_pages[i]); - _pages[i] = NULL; // TODO : Remove NULL values - ++freedPagesCount; - } - } - - //printf("%d freed pages\n", freedPagesCount); + //std::sort(_pages.begin(), _pages.end()); + Array<size_t> numberOfFreeChunksPerPage; + numberOfFreeChunksPerPage.resize(_pages.size()); + for(size_t i=0; i<numberOfFreeChunksPerPage.size(); ++i) { + numberOfFreeChunksPerPage[i] = 0; + } + + void* iterator = _next; + while(iterator) { + // This should be a binary search + for(size_t i=0; i<_pages.size(); ++i) { + if(isPointerInPage(iterator, _pages[i])) { + ++numberOfFreeChunksPerPage[i]; + break; + } + } + iterator = *(void**)iterator; + } + + size_t freedPagesCount = 0; + for(size_t i=0; i<_pages.size(); ++i) { + if(numberOfFreeChunksPerPage[i] == CHUNK_PAGE_SIZE) { + ::free(_pages[i]); + _pages[i] = NULL; // TODO : Remove NULL values + ++freedPagesCount; + } + } + + //printf("%d freed pages\n", freedPagesCount); } } diff --git a/common/memorypool.h b/common/memorypool.h index b9c0b38595..9ecab9e90b 100644 --- a/common/memorypool.h +++ b/common/memorypool.h @@ -26,7 +26,7 @@ #ifndef COMMON_MEMORYPOOL_H #define COMMON_MEMORYPOOL_H -#include <string.h> +#include "common/scummsys.h" #include "common/array.h" namespace Common @@ -34,24 +34,24 @@ namespace Common class MemoryPool { - private: - MemoryPool(const MemoryPool&); - MemoryPool& operator=(const MemoryPool&); +private: + MemoryPool(const MemoryPool&); + MemoryPool& operator=(const MemoryPool&); - size_t _chunkSize; - Array<void*> _pages; - void* _next; + size_t _chunkSize; + Array<void*> _pages; + void* _next; - void* allocPage(); - bool isPointerInPage(void* ptr, void* page); - public: - MemoryPool(size_t chunkSize); - ~MemoryPool(); + void* allocPage(); + bool isPointerInPage(void* ptr, void* page); +public: + MemoryPool(size_t chunkSize); + ~MemoryPool(); - void* malloc(); - void free(void* ptr); + void* malloc(); + void free(void* ptr); - void freeUnusedPages(); + void freeUnusedPages(); }; } |