Whitespacing fixes
svn-id: r31330
This commit is contained in:
parent
a51c2657b6
commit
5f3529ce78
3 changed files with 81 additions and 82 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
//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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
//printf("%d freed pages\n", freedPagesCount);
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue