tahoma2d/toonz/sources/toonzfarm/tnzcore_stuff/tsmartpointer.cpp

73 lines
1.8 KiB
C++
Raw Normal View History

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
}
//-------------------------------------------------------------------