33 #include "NCMLDebug.h"
53 , _pool(proto._pool), _preDeleteCallbacks()
65 NCML_ASSERT_MSG(_preDeleteCallbacks.empty(),
66 "~RCObject() called with a non-empty listener list!");
72 BESDEBUG(
"ncml:memory",
"Ref count for " << printRCObject() <<
" is now: " << _count << endl);
81 const_cast<RCObject*
>(
this)->executeAndClearPreDeleteCallbacks();
83 BESDEBUG(
"ncml:memory",
84 "Releasing back to pool: Object ref count hit 0. " << printRCObject() <<
" with toString() == " <<
toString() << endl);
88 BESDEBUG(
"ncml:memory",
89 "Calling delete: Object ref count hit 0. " << printRCObject() <<
" with toString() == " <<
toString() << endl);
94 BESDEBUG(
"ncml:memory",
"unref() called and: " << printRCObject() << endl);
116 return printRCObject();
119 string RCObject::printRCObject()
const
121 std::ostringstream oss;
122 oss <<
"RCObject@(" <<
reinterpret_cast<const void*
>(
this) <<
") _count=" << _count <<
" numberDeleteListeners="
123 << _preDeleteCallbacks.size();
131 if (std::find(_preDeleteCallbacks.begin(), _preDeleteCallbacks.end(), pCB) == _preDeleteCallbacks.end()) {
132 BESDEBUG(
"ncml:memory",
133 "Adding WeakRCPtr listener: " << printRCObject() <<
" is getting listener: " <<
reinterpret_cast<const void*
>(pCB) << endl);
134 _preDeleteCallbacks.push_back(pCB);
135 BESDEBUG(
"ncml:memory",
"After listener add, obj is: " << printRCObject() << endl);
143 BESDEBUG(
"ncml:memory",
144 "Removing WeakRCPtr listener from: " << printRCObject() <<
" Removed listener: " <<
reinterpret_cast<const void*
>(pCB) << endl);
145 _preDeleteCallbacks.remove(pCB);
146 BESDEBUG(
"ncml:mempory",
"Object after remove listener is: " << printRCObject() << endl);
150 void RCObject::executeAndClearPreDeleteCallbacks()
157 while (!(_preDeleteCallbacks.empty())) {
159 _preDeleteCallbacks.pop_front();
161 pCB->executeUseCountHitZeroCB(
this);
164 NCML_ASSERT(_preDeleteCallbacks.empty());
182 RCObjectSet::const_iterator foundIt = _liveObjects.find(pObj);
183 return (foundIt != _liveObjects.end());
189 throw string(
"Internal Pool Error: Object added twice!");
191 _liveObjects.insert(pObj);
198 _liveObjects.erase(pObj);
204 BESDEBUG(
"ncml:memory",
205 "RCObjectPool::release(): Calling delete on released object=" << pObj->printRCObject() << endl);
209 BESDEBUG(
"ncml:memory",
210 "RCObjectPool::release(): Removing object, but not deleting it: " << pObj->printRCObject() << endl);
214 BESDEBUG(
"ncml:memory",
"ERROR: RCObjectPool::release() called on object not in pool!! Ignoring!" << endl);
220 BESDEBUG(
"ncml:memory",
"RCObjectPool::deleteAllObjects() started...." << endl);
221 RCObjectSet::iterator endIt = _liveObjects.end();
222 RCObjectSet::iterator it = _liveObjects.begin();
223 for (; it != endIt; ++it) {
227 pObj->executeAndClearPreDeleteCallbacks();
228 BESDEBUG(
"ncml:memory",
"Calling delete on RCObject=" << pObj->printRCObject() << endl);
232 _liveObjects.clear();
233 BESDEBUG(
"ncml:memory",
"RCObjectPool::deleteAllObjects() complete!" << endl);