aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/hashmap.h20
-rw-r--r--common/memorypool.cpp117
-rw-r--r--common/memorypool.h30
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();
};
}