85 lines
1.9 KiB
C++
85 lines
1.9 KiB
C++
|
|
||
|
|
||
|
#include "tsmartpointer.h"
|
||
|
#include "tthreadmessage.h"
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
typedef TAtomicVar *TAtomicVarPtr;
|
||
|
|
||
|
const int maxClassCode = 200;
|
||
|
TAtomicVarPtr instanceCounts[maxClassCode + 1];
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
inline TAtomicVar &getInstanceCounter(TINT32 classCode)
|
||
|
{
|
||
|
assert(0 <= classCode && classCode <= maxClassCode);
|
||
|
TAtomicVarPtr &instanceCountPtr = instanceCounts[classCode];
|
||
|
if (instanceCountPtr == 0) {
|
||
|
static TThread::Mutex mutex;
|
||
|
TThread::MutexLocker g(&mutex);
|
||
|
if (instanceCountPtr == 0)
|
||
|
instanceCountPtr = new TAtomicVar();
|
||
|
}
|
||
|
assert(instanceCountPtr);
|
||
|
return *instanceCountPtr;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
#ifdef INSTANCE_COUNT_ENABLED
|
||
|
const TINT32 TSmartObject::m_unknownClassCode = 0;
|
||
|
#endif
|
||
|
|
||
|
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
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|
||
|
|
||
|
TINT32 TSmartObject::getInstanceCount(ClassCode
|
||
|
#ifdef INSTANCE_COUNT_ENABLED
|
||
|
code
|
||
|
#endif
|
||
|
)
|
||
|
{
|
||
|
#ifdef INSTANCE_COUNT_ENABLED
|
||
|
TAtomicVar &instanceCount = getInstanceCounter(code);
|
||
|
return instanceCount;
|
||
|
#else
|
||
|
assert(0);
|
||
|
return 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------
|