Hi all,
I'm currently testing my osg application and I sometimes (1/10000) get the
following warning:
"Warning: deleting still referenced object XXX of type 'XXX'
the final reference count was 1, memory corruption possible."
Followed by a crash.
Looking at osg::Referenced::unref(), I wonder if this function is really
thread safe.
Indeed, nothing seems to prevent the _refCount variable to be modified
between the operator-- and the deletion of the object.
If a thread increments _refCount after the operator--, the delete is still
called and we get the warning.
I made a quick test to reproduce it:
#include <OpenThreads/Thread>
#include <osg/Image>
class MyThread :
public OpenThreads::Thread {
public:
MyThread(osg::Image* imagePtr) :
_imagePtr(imagePtr) {
}
virtual ~MyThread() {
}
void run() {
microSleep(50);
_imageRefPtr = _imagePtr;
}
osg::Image* _imagePtr;
osg::ref_ptr<osg::Image> _imageRefPtr;
};
int main(int argc, char** argv) {
osg::Image* imagePtr = new osg::Image();
MyThread t(imagePtr);
osg::ref_ptr<osg::Image> imageRefPtr(imagePtr);
t.startThread();
imageRefPtr = 0;
t.join();
return 0;
}
I also needed to add a microsleep in osg::Referenced::unref() so that i
could reproduce the warning more easlily.
if (needDelete)
{
OpenThreads::Thread::microSleep(1000);
signalObserversAndDelete(true,true);
}
return newRef;
Thanks
Mikaƫl
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org