Hi Fabian & Chris, I was curious about the clean up of the global getGlobalReferencedMutex() so I added some debug messages to OpenThreads and to relevant calls in the OSG to track the creation and clean up of mutexes. I tried an alternative means of static initialization of the static getGlobalReferencedMutex() and got the same behavior for before and after results so I don't think the version in the 3.6 branch is likley to be be a source of problem, even if it's not particular clean. Below is diff of the changes I made.
Robert $ git diff diff --git a/src/OpenThreads/pthreads/PThreadMutex.cpp b/src/OpenThreads/pthreads/PThreadMutex.cpp index 3a3d1c338..d122fc67c 100644 --- a/src/OpenThreads/pthreads/PThreadMutex.cpp +++ b/src/OpenThreads/pthreads/PThreadMutex.cpp @@ -22,6 +22,8 @@ #include <OpenThreads/Mutex> #include "PThreadMutexPrivateData.h" +#include <stdio.h> + using namespace OpenThreads; //---------------------------------------------------------------------------- @@ -33,7 +35,7 @@ using namespace OpenThreads; Mutex::Mutex(MutexType type): _mutexType(type) { - + printf("Mutex::Mutex(%d) %p\n", type, this); pthread_mutexattr_t mutex_attr; pthread_mutexattr_init( &mutex_attr ); @@ -107,6 +109,8 @@ Mutex::Mutex(MutexType type): // Mutex::~Mutex() { + printf("Mutex::~Mutex() %p\n", this); + PThreadMutexPrivateData *pd = static_cast<PThreadMutexPrivateData*>(_prvData); diff --git a/src/osg/Referenced.cpp b/src/osg/Referenced.cpp index 95b665c57..267bda310 100644 --- a/src/osg/Referenced.cpp +++ b/src/osg/Referenced.cpp @@ -79,11 +79,16 @@ struct ResetPointer }; typedef ResetPointer<DeleteHandler> DeleteHandlerPointer; + +#if 1 +#include <stdio.h> + typedef ResetPointer<OpenThreads::Mutex> GlobalMutexPointer; OpenThreads::Mutex* Referenced::getGlobalReferencedMutex() { static GlobalMutexPointer s_ReferencedGlobalMutext = new OpenThreads::Mutex; + printf("Referenced::getGlobalReferencedMutex() %p\n", (s_ReferencedGlobalMutext.get())); return s_ReferencedGlobalMutext.get(); } @@ -96,6 +101,17 @@ struct InitGlobalMutexes } }; static InitGlobalMutexes s_initGlobalMutexes; +#else + +#include <stdio.h> + +static OpenThreads::Mutex s_ReferencedGlobalMutex; +OpenThreads::Mutex* Referenced::getGlobalReferencedMutex() +{ + printf("Referenced::getGlobalReferencedMutex() %p\n", (&s_ReferencedGlobalMutex)); + return &s_ReferencedGlobalMutex; +} +#endif // static std::auto_ptr<DeleteHandler> s_deleteHandler(0); static DeleteHandlerPointer s_deleteHandler(0); diff --git a/src/osg/StateAttribute.cpp b/src/osg/StateAttribute.cpp index e239fb3aa..c7df40894 100644 --- a/src/osg/StateAttribute.cpp +++ b/src/osg/StateAttribute.cpp @@ -39,6 +39,8 @@ void StateAttribute::removeParent(osg::StateSet* object) ParentList::iterator pitr = std::find(_parents.begin(),_parents.end(),object); if (pitr!=_parents.end()) _parents.erase(pitr); + + printf("StateAttribute::removeParent()\n"); }
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org