summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BlockFactory.cpp43
-rw-r--r--BlockFactory.h2
-rw-r--r--main.cpp4
3 files changed, 33 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 );
+ }
}
diff --git a/BlockFactory.h b/BlockFactory.h
index a122dd6..a8d2046 100644
--- a/BlockFactory.h
+++ b/BlockFactory.h
@@ -5,6 +5,7 @@
class BlockFactory
{
uint32_t poolSize;
+ uint32_t blocksCreated;
vector<Block*> pool;
public:
@@ -13,6 +14,7 @@ public:
Block* allocateBlock( );
void deleteBlock( Block* );
uint32_t getPoolSize(){ return poolSize; }
+ uint32_t getBlocksCreated(){ return blocksCreated; }
};
diff --git a/main.cpp b/main.cpp
index 63cf86e..f76bac4 100644
--- a/main.cpp
+++ b/main.cpp
@@ -6,6 +6,7 @@ using namespace std;
#include "common.h"
#include "Block.h"
+#include "BlockFactory.h"
#include "GUI.h"
//#include "SpriteMaps.h"
#include "GameBuildings.h"
@@ -521,6 +522,9 @@ static void * stonesense_thread(ALLEGRO_THREAD * main_thread, void * parms)
delete last;
}
+ //need to explicitly tear down the current block factory
+ blockFactory.~BlockFactory();
+
al_destroy_bitmap(IMGIcon);
IMGIcon = 0;
delete contentLoader;