104 lines
1.7 KiB
C++
104 lines
1.7 KiB
C++
|
/*
|
||
|
* Copyright (c) 2006, Haiku, Inc.
|
||
|
* Distributed under the terms of the MIT license.
|
||
|
*
|
||
|
* Authors:
|
||
|
* Stephan Aßmus <superstippi@gmx.de>
|
||
|
*/
|
||
|
|
||
|
#include "RegionPool.h"
|
||
|
|
||
|
#include <new>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#if DEBUG_LEAK
|
||
|
#include <debugger.h>
|
||
|
#endif
|
||
|
|
||
|
#include <Region.h>
|
||
|
|
||
|
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
|
||
|
}
|
||
|
|