diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/shared/Config/dotconfpp/mempool.cpp | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'src/shared/Config/dotconfpp/mempool.cpp')
-rw-r--r-- | src/shared/Config/dotconfpp/mempool.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/shared/Config/dotconfpp/mempool.cpp b/src/shared/Config/dotconfpp/mempool.cpp index 019cfe3cb86..cec8e8d119f 100644 --- a/src/shared/Config/dotconfpp/mempool.cpp +++ b/src/shared/Config/dotconfpp/mempool.cpp @@ -1,20 +1,25 @@ + #include "mempool.h" + AsyncDNSMemPool::PoolChunk::PoolChunk(size_t _size): pool(NULL), pos(0), size(_size) { pool = ::malloc(size); } + AsyncDNSMemPool::PoolChunk::~PoolChunk() { ::free(pool); } + AsyncDNSMemPool::AsyncDNSMemPool(size_t _defaultSize): chunks(NULL), chunksCount(0), defaultSize(_defaultSize), poolUsage(0), poolUsageCounter(0) { } + AsyncDNSMemPool::~AsyncDNSMemPool() { for(size_t i = 0; i<chunksCount; ++i){ @@ -22,15 +27,19 @@ AsyncDNSMemPool::~AsyncDNSMemPool() } ::free(chunks); } + int AsyncDNSMemPool::initialize() { chunksCount = 1; chunks = (PoolChunk**)::malloc(sizeof(PoolChunk*)); if(chunks == NULL) return -1; + chunks[chunksCount-1] = new PoolChunk(defaultSize); + return 0; } + void AsyncDNSMemPool::addNewChunk(size_t size) { ++chunksCount; @@ -40,6 +49,7 @@ void AsyncDNSMemPool::addNewChunk(size_t size) else chunks[chunksCount-1] = new PoolChunk(size); } + void * AsyncDNSMemPool::alloc(size_t size) { PoolChunk * chunk = NULL; @@ -54,17 +64,20 @@ void * AsyncDNSMemPool::alloc(size_t size) chunks[chunksCount-1]->pos = size; return chunks[chunksCount-1]->pool; } + void AsyncDNSMemPool::free() { size_t pu = 0; size_t psz = 0; ++poolUsageCounter; + for(size_t i = 0; i<chunksCount; ++i){ pu += chunks[i]->pos; psz += chunks[i]->size; chunks[i]->pos = 0; } poolUsage=(poolUsage>pu)?poolUsage:pu; + if(poolUsageCounter >= 10 && chunksCount > 1){ psz -= chunks[chunksCount-1]->size; if(poolUsage < psz){ @@ -75,10 +88,12 @@ void AsyncDNSMemPool::free() poolUsageCounter = 0; } } + void * AsyncDNSMemPool::calloc(size_t size) { return ::memset(this->alloc(size), 0, size); } + char * AsyncDNSMemPool::strdup(const char *str) { return ::strcpy((char*)this->alloc(strlen(str)+1), str); |