55 , _pool(proto._pool), _preDeleteCallbacks()
67 NCML_ASSERT_MSG(_preDeleteCallbacks.empty(),
68 "~RCObject() called with a non-empty listener list!");
74 BESDEBUG(
"ncml:memory",
"Ref count for " << printRCObject() <<
" is now: " << _count << endl);
83 const_cast<RCObject*
>(
this)->executeAndClearPreDeleteCallbacks();
85 BESDEBUG(
"ncml:memory",
86 "Releasing back to pool: Object ref count hit 0. " << printRCObject() <<
" with toString() == " <<
toString() << endl);
90 BESDEBUG(
"ncml:memory",
91 "Calling delete: Object ref count hit 0. " << printRCObject() <<
" with toString() == " <<
toString() << endl);
96 BESDEBUG(
"ncml:memory",
"unref() called and: " << printRCObject() << endl);
118 return printRCObject();
121string RCObject::printRCObject()
const
123 std::ostringstream oss;
124 oss <<
"RCObject@(" <<
reinterpret_cast<const void*
>(
this) <<
") _count=" << _count <<
" numberDeleteListeners="
125 << _preDeleteCallbacks.size();
133 if (std::find(_preDeleteCallbacks.begin(), _preDeleteCallbacks.end(), pCB) == _preDeleteCallbacks.end()) {
134 BESDEBUG(
"ncml:memory",
135 "Adding WeakRCPtr listener: " << printRCObject() <<
" is getting listener: " <<
reinterpret_cast<const void*
>(pCB) << endl);
136 _preDeleteCallbacks.push_back(pCB);
137 BESDEBUG(
"ncml:memory",
"After listener add, obj is: " << printRCObject() << endl);
145 BESDEBUG(
"ncml:memory",
146 "Removing WeakRCPtr listener from: " << printRCObject() <<
" Removed listener: " <<
reinterpret_cast<const void*
>(pCB) << endl);
147 _preDeleteCallbacks.remove(pCB);
148 BESDEBUG(
"ncml:mempory",
"Object after remove listener is: " << printRCObject() << endl);
152void RCObject::executeAndClearPreDeleteCallbacks()
159 while (!(_preDeleteCallbacks.empty())) {
161 _preDeleteCallbacks.pop_front();
163 pCB->executeUseCountHitZeroCB(
this);
166 NCML_ASSERT(_preDeleteCallbacks.empty());
184 RCObjectSet::const_iterator foundIt = _liveObjects.find(pObj);
185 return (foundIt != _liveObjects.end());
191 throw string(
"Internal Pool Error: Object added twice!");
193 _liveObjects.insert(pObj);
200 _liveObjects.erase(pObj);
206 BESDEBUG(
"ncml:memory",
207 "RCObjectPool::release(): Calling delete on released object=" << pObj->printRCObject() << endl);
211 BESDEBUG(
"ncml:memory",
212 "RCObjectPool::release(): Removing object, but not deleting it: " << pObj->printRCObject() << endl);
216 BESDEBUG(
"ncml:memory",
"ERROR: RCObjectPool::release() called on object not in pool!! Ignoring!" << endl);
222 BESDEBUG(
"ncml:memory",
"RCObjectPool::deleteAllObjects() started...." << endl);
223 RCObjectSet::iterator endIt = _liveObjects.end();
224 RCObjectSet::iterator it = _liveObjects.begin();
225 for (; it != endIt; ++it) {
229 pObj->executeAndClearPreDeleteCallbacks();
230 BESDEBUG(
"ncml:memory",
"Calling delete on RCObject=" << pObj->printRCObject() << endl);
234 _liveObjects.clear();
235 BESDEBUG(
"ncml:memory",
"RCObjectPool::deleteAllObjects() complete!" << endl);
bool contains(RCObject *pObj) const
void release(RCObject *pObj, bool shouldDelete=true)
void remove(RCObject *pObj)
A base class for a simple reference counted object.
virtual std::string toString() const
RCObject(RCObjectPool *pool=0)
virtual void removeFromPool() const
void removePreDeleteCB(UseCountHitZeroCB *pCB)
virtual int unref() const
void addPreDeleteCB(UseCountHitZeroCB *pCB)
virtual int getRefCount() const
Helper class for temporarily hijacking an existing dhi to load a DDX response for one particular file...