2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
|
|
|
|
#include "tsmartpointer.h"
|
|
|
|
#include "tthread.h"
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
namespace {
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
|
|
|
typedef TAtomicVar *TAtomicVarPtr;
|
|
|
|
|
|
|
|
const int maxClassCode = 100;
|
|
|
|
TAtomicVarPtr instanceCounts[maxClassCode + 1];
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
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;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
} // namespace
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
|
|
|
const long TSmartObject::m_unknownClassCode = 0;
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TSmartObject::incrementInstanceCount() {
|
2016-03-19 06:57:51 +13:00
|
|
|
#ifdef INSTANCE_COUNT_ENABLED
|
2016-06-15 18:43:10 +12:00
|
|
|
TAtomicVar &instanceCount = getInstanceCounter(m_classCodeRef);
|
|
|
|
++instanceCount;
|
2016-03-19 06:57:51 +13:00
|
|
|
#else
|
2016-06-15 18:43:10 +12:00
|
|
|
assert(0);
|
2016-03-19 06:57:51 +13:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TSmartObject::decrementInstanceCount() {
|
2016-03-19 06:57:51 +13:00
|
|
|
#ifdef INSTANCE_COUNT_ENABLED
|
2016-06-15 18:43:10 +12:00
|
|
|
TAtomicVar &instanceCount = getInstanceCounter(m_classCodeRef);
|
|
|
|
assert(instanceCount > 0);
|
|
|
|
--instanceCount;
|
2016-03-19 06:57:51 +13:00
|
|
|
#else
|
2016-06-15 18:43:10 +12:00
|
|
|
assert(0);
|
2016-03-19 06:57:51 +13:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
long TSmartObject::getInstanceCount(ClassCode code) {
|
2016-03-19 06:57:51 +13:00
|
|
|
#ifdef INSTANCE_COUNT_ENABLED
|
2016-06-15 18:43:10 +12:00
|
|
|
TAtomicVar &instanceCount = getInstanceCounter(code);
|
|
|
|
return instanceCount;
|
2016-03-19 06:57:51 +13:00
|
|
|
#else
|
2016-06-15 18:43:10 +12:00
|
|
|
assert(0);
|
|
|
|
return 0;
|
2016-03-19 06:57:51 +13:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|