4 IMMObject *IMMObject::liveObjects=0;
\r
5 IMMObject *IMMObject::deadObjects=0;
\r
6 std::list<IMMObject *> IMMObject::heapObjects;
\r
8 IMMObject::IMMObject()
\r
10 nextObject=prevObject=0;
\r
12 std::list<IMMObject*>::iterator it=std::find(heapObjects.begin(),heapObjects.end(),this);
\r
13 if(it==heapObjects.end())
\r
15 bIsStackAllocated=true;
\r
17 bIsStackAllocated=false;
\r
18 heapObjects.erase(it);
\r
20 if(!bIsStackAllocated)
\r
22 //start on the deadObjects list
\r
23 nextObject=deadObjects;
\r
24 if(deadObjects)deadObjects->prevObject=this;
\r
29 IMMObject::~IMMObject()
\r
34 void IMMObject::CollectGarbage()
\r
38 IMMObject *nObj=deadObjects->nextObject;
\r
44 void IMMObject::AddRef()
\r
47 if(!bIsStackAllocated&&(refCount==1))
\r
49 //move to the liveObjects list
\r
50 if(prevObject)prevObject->nextObject=nextObject;
\r
51 if(nextObject)nextObject->prevObject=prevObject;
\r
52 if(deadObjects==this)deadObjects=nextObject;
\r
54 nextObject=liveObjects; if(liveObjects)liveObjects->prevObject=this;
\r
59 void IMMObject::Release()
\r
62 if(!bIsStackAllocated&&(refCount<=0))
\r
64 //remove self from live list
\r
65 if(prevObject)prevObject->nextObject=nextObject;
\r
66 if(nextObject)nextObject->prevObject=prevObject;
\r
67 if(liveObjects==this)liveObjects=nextObject;
\r
69 //add self to dead list
\r
70 nextObject=deadObjects;
\r
71 if(deadObjects)deadObjects->prevObject=this;
\r
77 void IMMObject::CollectRemainingObjects(bool bEmitWarnings)
\r
82 IMMObject *o=liveObjects->nextObject;
\r
85 //copy the object to a temporary buffer so that our '10 bytes' message doesn't
\r
86 //cause an access violation
\r
87 char szBuf[11]; ZeroMemory(szBuf,11);
\r
88 memcpy(szBuf,liveObjects,min(liveObjects->size(),10));
\r
89 CLog::Get().Write(LOG_APP,IDS_UNRELEASED_OBJECT,liveObjects,liveObjects->size(),szBuf);
\r
96 void* IMMObject::operator new(size_t objsize)
\r
98 void *newObj=malloc(objsize);
\r
99 heapObjects.push_back((IMMObject*)newObj);
\r
103 void IMMObject::operator delete(void* obj)
\r
105 if(!((IMMObject*)obj)->bIsStackAllocated)free(obj);
\r