tahoma2d/toonz/sources/toonzfarm/tnzcore_stuff/tsmartpointer.cpp
Toshihiro Shimizu 890dddabbd first commit
2016-03-19 02:57:51 +09:00

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