79 lines
1.8 KiB
C++
79 lines
1.8 KiB
C++
|
|
||
|
|
||
|
#include "tsmartpointer.h"
|
||
|
#include "tthread.h"
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
typedef TAtomicVar *TAtomicVarPtr;
|
||
|
|
||
|
const int maxClassCode = 100;
|
||
|
TAtomicVarPtr instanceCounts[maxClassCode + 1];
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
inline TAtomicVar &getInstanceCounter(long classCode)
|
||
|
{
|
||
|
assert(0 <= classCode && classCode <= maxClassCode);
|
||
|
TAtomicVarPtr &instanceCountPtr = instanceCounts[classCode];
|
||
|
if (instanceCountPtr == 0) {
|
||
|
static TThread::Mutex mutex;
|
||
|
TThread::ScopedLock g(mutex);
|
||
|
if (instanceCountPtr == 0)
|
||
|
instanceCountPtr = new TAtomicVar();
|
||
|
}
|
||
|
assert(instanceCountPtr);
|
||
|
return *instanceCountPtr;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
const long TSmartObject::m_unknownClassCode = 0;
|
||
|
|
||
|
void TSmartObject::incrementInstanceCount()
|
||
|
{
|
||
|
#ifdef INSTANCE_COUNT_ENABLED
|
||
|
TAtomicVar &instanceCount = getInstanceCounter(m_classCodeRef);
|
||
|
++instanceCount;
|
||
|
#else
|
||
|
assert(0);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
void TSmartObject::decrementInstanceCount()
|
||
|
{
|
||
|
#ifdef INSTANCE_COUNT_ENABLED
|
||
|
TAtomicVar &instanceCount = getInstanceCounter(m_classCodeRef);
|
||
|
assert(instanceCount > 0);
|
||
|
--instanceCount;
|
||
|
#else
|
||
|
assert(0);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
long TSmartObject::getInstanceCount(ClassCode code)
|
||
|
{
|
||
|
#ifdef INSTANCE_COUNT_ENABLED
|
||
|
TAtomicVar &instanceCount = getInstanceCounter(code);
|
||
|
return instanceCount;
|
||
|
#else
|
||
|
assert(0);
|
||
|
return 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|