1 #ifndef USING_ENGINUITY
\r
2 #define USING_ENGINUITY
\r
7 IMMObject *IMMObject::liveObjects=0;
\r
8 IMMObject *IMMObject::deadObjects=0;
\r
9 std::list<IMMObject *> IMMObject::heapObjects;
\r
10 unsigned long IMMObject::heapUsage=0;
\r
12 IMMObject::IMMObject()
\r
14 nextObject=prevObject=0;
\r
16 std::list<IMMObject*>::iterator it=std::find(heapObjects.begin(),heapObjects.end(),this);
\r
17 if(it==heapObjects.end())
\r
19 bIsStackAllocated=true;
\r
21 bIsStackAllocated=false;
\r
22 heapObjects.erase(it);
\r
24 if(!bIsStackAllocated)
\r
26 //start on the deadObjects list
\r
27 nextObject=deadObjects;
\r
28 if(deadObjects)deadObjects->prevObject=this;
\r
33 IMMObject::~IMMObject()
\r
38 void IMMObject::CollectGarbage()
\r
42 IMMObject *nObj=deadObjects->nextObject;
\r
48 void IMMObject::AddRef()
\r
51 if(!bIsStackAllocated&&(refCount==1))
\r
53 //move to the liveObjects list
\r
54 if(prevObject)prevObject->nextObject=nextObject;
\r
55 if(nextObject)nextObject->prevObject=prevObject;
\r
56 if(deadObjects==this)deadObjects=nextObject;
\r
58 nextObject=liveObjects; if(liveObjects)liveObjects->prevObject=this;
\r
63 void IMMObject::Release()
\r
66 if(!bIsStackAllocated&&(refCount<=0))
\r
68 //remove self from live list
\r
69 if(prevObject)prevObject->nextObject=nextObject;
\r
70 if(nextObject)nextObject->prevObject=prevObject;
\r
71 if(liveObjects==this)liveObjects=nextObject;
\r
73 //add self to dead list
\r
74 nextObject=deadObjects;
\r
75 if(deadObjects)deadObjects->prevObject=this;
\r
81 void IMMObject::CollectRemainingObjects(bool bEmitWarnings)
\r
86 IMMObject *o=liveObjects->nextObject;
\r
89 //copy the object to a temporary buffer so that our '10 bytes' message doesn't
\r
90 //cause an access violation
\r
91 char szBuf[11]; memset(szBuf,0,11);
\r
92 memcpy(szBuf,liveObjects,min(liveObjects->size(),10));
\r
93 CLog::Get().Write(LOG_APP,IDS_UNRELEASED_OBJECT,liveObjects,liveObjects->size(),szBuf);
\r
100 void* IMMObject::operator new(size_t objsize)
\r
102 void *newObj=malloc(objsize);
\r
103 heapUsage+=objsize;
\r
104 heapObjects.push_back((IMMObject*)newObj);
\r
105 ((IMMObject*)newObj)->heapAllocSize=objsize;
\r
109 void IMMObject::operator delete(void* obj)
\r
111 if(!((IMMObject*)obj)->bIsStackAllocated)
\r
113 heapUsage-=((IMMObject*)obj)->heapAllocSize;
\r