1/* 2 * Copyright (c) 2006, Haiku, Inc. 3 * Distributed under the terms of the MIT license. 4 * 5 * Authors: 6 * Stephan Aßmus <superstippi@gmx.de> 7 */ 8 9#include "RegionPool.h" 10 11#include <new> 12#include <stdio.h> 13 14#if DEBUG_LEAK 15#include <debugger.h> 16#endif 17 18#include <Region.h> 19 20using std::nothrow; 21 22RegionPool::RegionPool() 23 : fAvailable(4) 24#if DEBUG_LEAK 25 ,fUsed(4) 26#endif 27{ 28} 29 30 31RegionPool::~RegionPool() 32{ 33#if DEBUG_LEAK 34 if (fUsed.CountItems() > 0) 35 debugger("RegionPool::~RegionPool() - some regions still in use!"); 36#endif 37 int32 count = fAvailable.CountItems(); 38 for (int32 i = 0; i < count; i++) 39 delete (BRegion*)fAvailable.ItemAtFast(i); 40} 41 42 43BRegion* 44RegionPool::GetRegion() 45{ 46 BRegion* region = (BRegion*)fAvailable.RemoveItem( 47 fAvailable.CountItems() - 1); 48 if (!region) { 49 region = new (nothrow) BRegion(); 50 if (!region) { 51 // whoa 52 fprintf(stderr, "RegionPool::GetRegion() - " 53 "no memory!\n"); 54 } 55 } 56#if DEBUG_LEAK 57 fUsed.AddItem(region); 58#endif 59 return region; 60} 61 62 63BRegion* 64RegionPool::GetRegion(const BRegion& other) 65{ 66 BRegion* region; 67 int32 count = fAvailable.CountItems(); 68 if (count > 0) { 69 region = (BRegion*)fAvailable.RemoveItem(count - 1); 70 *region = other; 71 } else { 72 region = new (nothrow) BRegion(other); 73 if (!region) { 74 // whoa 75 fprintf(stderr, "RegionPool::GetRegion() - " 76 "no memory!\n"); 77 } 78 } 79 80#if DEBUG_LEAK 81 fUsed.AddItem(region); 82#endif 83 return region; 84} 85 86 87void 88RegionPool::Recycle(BRegion* region) 89{ 90 if (!fAvailable.AddItem(region)) { 91 // at least don't leak the region... 92 fprintf(stderr, "RegionPool::Recycle() - " 93 "no memory!\n"); 94 delete region; 95 } else { 96 // prepare for next usage 97 region->MakeEmpty(); 98 } 99#if DEBUG_LEAK 100 fUsed.RemoveItem(region); 101#endif 102} 103 104