/* * Copyright (c) 2006, Haiku, Inc. * Distributed under the terms of the MIT license. * * Authors: * Stephan Aßmus */ #include "RegionPool.h" #include #include #if DEBUG_LEAK #include #endif #include using std::nothrow; RegionPool::RegionPool() : fAvailable(4) #if DEBUG_LEAK ,fUsed(4) #endif { } RegionPool::~RegionPool() { #if DEBUG_LEAK if (fUsed.CountItems() > 0) debugger("RegionPool::~RegionPool() - some regions still in use!"); #endif int32 count = fAvailable.CountItems(); for (int32 i = 0; i < count; i++) delete (BRegion*)fAvailable.ItemAtFast(i); } BRegion* RegionPool::GetRegion() { BRegion* region = (BRegion*)fAvailable.RemoveItem( fAvailable.CountItems() - 1); if (!region) { region = new (nothrow) BRegion(); if (!region) { // whoa fprintf(stderr, "RegionPool::GetRegion() - " "no memory!\n"); } } #if DEBUG_LEAK fUsed.AddItem(region); #endif return region; } BRegion* RegionPool::GetRegion(const BRegion& other) { BRegion* region; int32 count = fAvailable.CountItems(); if (count > 0) { region = (BRegion*)fAvailable.RemoveItem(count - 1); *region = other; } else { region = new (nothrow) BRegion(other); if (!region) { // whoa fprintf(stderr, "RegionPool::GetRegion() - " "no memory!\n"); } } #if DEBUG_LEAK fUsed.AddItem(region); #endif return region; } void RegionPool::Recycle(BRegion* region) { if (!fAvailable.AddItem(region)) { // at least don't leak the region... fprintf(stderr, "RegionPool::Recycle() - " "no memory!\n"); delete region; } else { // prepare for next usage region->MakeEmpty(); } #if DEBUG_LEAK fUsed.RemoveItem(region); #endif }