Whitespacing fixes

svn-id: r31330
This commit is contained in:
Bertrand Augereau 2008-03-30 14:07:34 +00:00
parent a51c2657b6
commit 5f3529ce78
3 changed files with 81 additions and 82 deletions

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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();
};
}