root/trunk/src/shared/Config/dotconfpp/mempool.cpp @ 143

Revision 2, 2.1 kB (checked in by yumileroy, 17 years ago)

[svn] * Proper SVN structure

Original author: Neo2003
Date: 2008-10-02 16:23:55-05:00

Line 
1
2
3
4#include "mempool.h"
5
6AsyncDNSMemPool::PoolChunk::PoolChunk(size_t _size):
7    pool(NULL), pos(0), size(_size)
8{
9    pool = ::malloc(size);
10}
11
12AsyncDNSMemPool::PoolChunk::~PoolChunk()
13{
14    ::free(pool);
15}
16
17AsyncDNSMemPool::AsyncDNSMemPool(size_t _defaultSize):
18    chunks(NULL), chunksCount(0), defaultSize(_defaultSize),
19    poolUsage(0), poolUsageCounter(0)
20{
21}
22
23AsyncDNSMemPool::~AsyncDNSMemPool()
24{
25    for(size_t i = 0; i<chunksCount; i++){
26        delete chunks[i];
27    }
28    ::free(chunks);
29}
30
31int AsyncDNSMemPool::initialize()
32{
33    chunksCount = 1;
34    chunks = (PoolChunk**)::malloc(sizeof(PoolChunk*));
35    if(chunks == NULL)
36        return -1;
37
38    chunks[chunksCount-1] = new PoolChunk(defaultSize);
39
40    return 0;
41}
42
43void AsyncDNSMemPool::addNewChunk(size_t size)
44{
45    ++chunksCount;
46    chunks = (PoolChunk**)::realloc(chunks, chunksCount*sizeof(PoolChunk*));
47    if(size <= defaultSize)
48        chunks[chunksCount-1] = new PoolChunk(defaultSize);
49    else
50        chunks[chunksCount-1] = new PoolChunk(size);
51}
52
53void * AsyncDNSMemPool::alloc(size_t size)
54{
55    PoolChunk * chunk = NULL;
56    for(size_t i = 0; i<chunksCount; i++){
57        chunk = chunks[i];
58        if((chunk->size - chunk->pos) >= size){
59            chunk->pos += size;
60            return ((char*)chunk->pool) + chunk->pos - size;
61        }
62    }
63    addNewChunk(size);
64    chunks[chunksCount-1]->pos = size;
65    return chunks[chunksCount-1]->pool;
66}
67
68void AsyncDNSMemPool::free()
69{
70    size_t pu = 0;
71    size_t psz = 0;
72    ++poolUsageCounter;
73
74    for(size_t i = 0; i<chunksCount; i++){
75        pu += chunks[i]->pos;
76        psz += chunks[i]->size;
77        chunks[i]->pos = 0;
78    }
79    poolUsage=(poolUsage>pu)?poolUsage:pu;
80
81    if(poolUsageCounter >= 10 && chunksCount > 1){
82        psz -= chunks[chunksCount-1]->size;
83        if(poolUsage < psz){
84            --chunksCount;
85            delete chunks[chunksCount];
86        }
87        poolUsage = 0;
88        poolUsageCounter = 0;
89    }
90}
91
92void * AsyncDNSMemPool::calloc(size_t size)
93{
94    return ::memset(this->alloc(size), 0, size);
95}
96
97char * AsyncDNSMemPool::strdup(const char *str)
98{
99    return ::strcpy((char*)this->alloc(strlen(str)+1), str);
100}
Note: See TracBrowser for help on using the browser.