| |
| |
| #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; |
| } |
| |
| |
| |
| } |
| |
| |
| |
| #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 |
| } |
| |
| |
| |