00001 // -*- Mode: c++ -*- 00002 00003 #include <QString> 00004 #include <QMutexLocker> 00005 #include "referencecounter.h" 00006 #include "mythlogging.h" 00007 00008 ReferenceCounter::ReferenceCounter(void) : 00009 m_refCount(1) 00010 { 00011 } 00012 00013 void ReferenceCounter::UpRef(void) 00014 { 00015 QMutexLocker mlock(&m_refLock); 00016 m_refCount++; 00017 LOG(VB_REFCOUNT, LOG_DEBUG, QString("%1(0x%2)::UpRef() -> %3") 00018 .arg(metaObject()->className()) 00019 .arg((uint64_t)this,0,16) 00020 .arg(QString::number(m_refCount))); 00021 } 00022 00023 bool ReferenceCounter::DownRef(void) 00024 { 00025 m_refLock.lock(); 00026 m_refCount--; 00027 LOG(VB_REFCOUNT, LOG_DEBUG, QString("%1(0x%2)::DownRef() -> %3") 00028 .arg(metaObject()->className()) 00029 .arg((uint64_t)this,0,16) 00030 .arg(QString::number(m_refCount))); 00031 00032 if (m_refCount == 0) 00033 { 00034 m_refLock.unlock(); 00035 delete this; 00036 return true; 00037 } 00038 00039 m_refLock.unlock(); 00040 return false; 00041 } 00042 00043 ReferenceLocker::ReferenceLocker(ReferenceCounter *counter, bool upref) : 00044 m_refObject(counter) 00045 { 00046 if (upref) 00047 m_refObject->UpRef(); 00048 } 00049 00050 ReferenceLocker::~ReferenceLocker(void) 00051 { 00052 m_refObject->DownRef(); 00053 m_refObject = NULL; 00054 }
1.6.3