Jump to content
  • Advertisement
Sign in to follow this  
_orm_

Garbage Collection Segfault

This topic is 2833 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

The last problem I submitted was on 64 Linux, now I have one on Win32 (at least confirmed, need to double check on Linux now).

Basically I have a garbage collected class that inherits from this helper class

class asGarbageCollected
{
public:
virtual ~asGarbageCollected(){}
void SetGCFlag()
{
ref_count |= 0x80000000;
}
bool GetGCFlag()
{
return (ref_count & 0x80000000) ? true : false;
}
int GetRefCount()
{
return (ref_count & 0x7FFFFFFF);
}
virtual void EnumReferences()=0;
void AddRef()
{
ref_count = (ref_count&0x7FFFFFFF) + 1;
}
void Release()
{
ref_count &= 0x7FFFFFFF;
if( --ref_count == 0 )
delete this;
}
virtual void ReleaseAllReferences()=0;
protected:
int ref_count;
asIScriptEngine* engine; // set by the inherited class.
};


However, when the garbage collector runs its cycle, it segfaults. Here's the callstack as reported by GDB
#0 00000000    0x00000051 in ??() (??:??)
#1 0044AC24 asCScriptEngine::CallObjectMethod(this=0x2bdf9e8, obj=0x2c03378, param=0x2bdf9e8, i=0x2bf2058, s=0x2bf20a8) (../../source/as_scriptengine.cpp:3179)
#2 0044AAE9 asCScriptEngine::CallObjectMethod(this=0x2bdf9e8, obj=0x2c03378, param=0x2bdf9e8, func=152) (../../source/as_scriptengine.cpp:3159)
#3 0046021E asCGarbageCollector::IdentifyGarbageWithCyclicRefs(this=0x2be0070) (../../source/as_gc.cpp:355)
#4 0045FBEB asCGarbageCollector::GarbageCollect(this=0x2be0070, flags=1) (../../source/as_gc.cpp:90)
#5 0044AFA3 asCScriptEngine::GarbageCollect(this=0x2bdf9e8, flags=1) (../../source/as_scriptengine.cpp:3284)
#6 0041F4BF mengi::Stage::Run(this=0x2bdf878) (C:/Documents and Settings/orm/Desktop/mengi/engine/src/Stage.cpp:498)
#7 0041E4F3 mengi::Stage::Update(this=0x2bdf878, t=2.50237131) (C:/Documents and Settings/orm/Desktop/mengi/engine/src/Stage.cpp:371)
#8 0040FA86 mengi::Engine::Run(this=0x2ae5e48) (C:/Documents and Settings/orm/Desktop/mengi/engine/src/Engine.cpp:325)
#9 004352BE main(argc=1, argv=0x2ae4588) (C:/Documents and Settings/orm/Desktop/mengi/engine/src/main.cpp:7)


I'll post more info from valgrind when i get back to my linux machine, because I doubt this is limited to just windows (building from svn)

Share this post


Link to post
Share on other sites
Advertisement
Does the class implementation inherit from anything else besides the asGarbageCollected helper class?

How is the object pointer informed to the GC? Make sure you don't have any invalid casts going, especially if you have multiple or virtual inheritances.

Share this post


Link to post
Share on other sites
AS a matter of fact, the class does implement a good number of interfaces as well as inheriting from another class used for numerical identification. How does that affect the garbage collector?

Share this post


Link to post
Share on other sites
It doesn't affect the GC itself. But with multiple inheritances the 'this' pointer changes depending on which base class you're refering to, so you will need to be careful with any casts of the object pointer. If you have an incorrect cast somewhere you may actually pass an incorrect 'this' pointer to the GC, and this might be causing the errors you're seeing.

Casts to and from void* is especially easy to mix up. You must make sure to always cast from void* to the same type it was before the pointer was cast to void*.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!