summaryrefslogtreecommitdiff
path: root/BlockFactory.cpp
diff options
context:
space:
mode:
authorCaldfir2012-05-26 14:09:40 -0700
committerCaldfir2012-05-26 14:09:40 -0700
commitf297adab478e2bf248b9f12091944ba47df4f2f2 (patch)
tree72635053b1c4ee480cc241f49aec9a5809ccdb5a /BlockFactory.cpp
parentc884d22b764b1c7dc090a5bf3be120bb9e65eceb (diff)
downloadstonesense-f297adab478e2bf248b9f12091944ba47df4f2f2.tar.gz
stonesense-f297adab478e2bf248b9f12091944ba47df4f2f2.tar.bz2
stonesense-f297adab478e2bf248b9f12091944ba47df4f2f2.tar.xz
Removed a memory leak associated with blocks that were being permanently cached.
Diffstat (limited to 'BlockFactory.cpp')
-rw-r--r--BlockFactory.cpp43
1 files changed, 27 insertions, 16 deletions
diff --git a/BlockFactory.cpp b/BlockFactory.cpp
index 03c6e8a..5d9d63b 100644
--- a/BlockFactory.cpp
+++ b/BlockFactory.cpp
@@ -6,32 +6,43 @@ BlockFactory blockFactory;
BlockFactory::BlockFactory(void)
{
- poolSize = 0;
+ poolSize = 0;
+ blocksCreated = 0;
}
BlockFactory::~BlockFactory(void)
{
- for(uint32_t i=0; i<poolSize; i++){
- free( pool[i] );
- }
+ for(uint32_t i=0; i<poolSize; i++){
+ free( pool[i] );
+ blocksCreated--;
+ }
+ poolSize = 0;
+ pool.clear();
}
Block* BlockFactory::allocateBlock(){
- if( poolSize > 0 ){
- poolSize--;
- Block* b = pool[poolSize];
- pool.pop_back();
- return b;
- }
-
- //pool is empty(full), just New up a new block
- Block* b = (Block*) malloc( sizeof(Block) );
- return b;
+ if( poolSize > 0 ){
+ poolSize--;
+ Block* b = pool[poolSize];
+ pool.pop_back();
+ return b;
+ }
+
+ //pool is empty(full), just New up a new block
+ blocksCreated++;
+ Block* b = (Block*) malloc( sizeof(Block) );
+ return b;
}
void BlockFactory::deleteBlock(Block *b){
- poolSize++;
- pool.push_back( b );
+ if(2*poolSize < blocksCreated){
+ poolSize++;
+ pool.push_back( b );
+ }
+ else{
+ blocksCreated--;
+ free( b );
+ }
}