version 1.1.2.1, 2006/06/30 18:31:16
|
version 1.1.2.8, 2006/06/30 22:37:52
|
|
|
#include <new> | #include <new> |
#include "IDFactory.h" | #include "IDFactory.h" |
| |
#define PEGASUS_IDFACTORY_MAGIC 0x94E91236 |
|
|
|
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
IDFactory::IDFactory() : _next(1), _magic(PEGASUS_IDFACTORY_MAGIC) |
IDFactory::IDFactory(Uint32 firstID) : _firstID(firstID), _nextID(_firstID) |
{ | { |
new (_mutex) Mutex(); |
|
} | } |
| |
IDFactory::~IDFactory() | IDFactory::~IDFactory() |
{ | { |
_magic = 0xDDDDDDDD; |
PEGASUS_DEBUG_ASSERT(_magic); |
// Note: never destructor mutex! |
} |
|
|
|
Uint32 IDFactory::getID() const |
|
{ |
|
PEGASUS_DEBUG_ASSERT(_magic); |
|
|
|
IDFactory* self = (IDFactory*)this; |
|
|
|
Uint32 id; |
|
|
|
self->_mutex.lock(); |
|
{ |
|
if (_pool.isEmpty()) |
|
{ |
|
if (self->_nextID < _firstID) |
|
self->_nextID = _firstID; |
|
|
|
id = self->_nextID++; |
|
} |
|
else |
|
{ |
|
id = _pool.top(); |
|
self->_pool.pop(); |
} | } |
|
} |
|
self->_mutex.unlock(); |
| |
Uint32 IDFactory::getNext() |
return id; |
|
} |
|
|
|
void IDFactory::putID(Uint32 id) |
{ | { |
if (_magic != PEGASUS_IDFACTORY_MAGIC) |
PEGASUS_DEBUG_ASSERT(_magic); |
|
PEGASUS_DEBUG_ASSERT(id >= _firstID); |
|
|
|
if (id < _firstID) |
|
return; |
|
|
|
_mutex.lock(); |
{ | { |
fprintf(stderr, |
_pool.push(id); |
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
} |
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
_mutex.unlock(); |
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n" |
|
"WARNING: IDFactory::getNext(): using destructed IDFactory\n"); |
|
} |
|
|
|
((Mutex*)_mutex)->lock(); |
|
Uint32 tmp = _next++; |
|
((Mutex*)_mutex)->unlock(); |
|
return tmp; |
|
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |