Hi
Your problem is weird, further I don't understand why you would have to create 
yourself a cullvisitor...
Give us the minimum code to reproduce the error please
(and use code section to keep indentation)


Rick Irons wrote:
> Hi all, 
> 
> I am encountering an issue with a CullVisitor object not being properly 
> deleted in version 3.4.0. I am encountering this issue when updating from 
> version 3.0.1. 
> 
> The source of the problem is a failed Referenced to CullVisitor dynamic cast 
> that occurs in the code below… 
> 
> virtual void objectDeleted(void* object) 
> { 
> osg::Referenced* ref = reinterpret_cast<osg::Referenced*>(object); 
> osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(ref); 
> OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 
> RenderStageMap::iterator itr = _renderStageMap.find(cv); 
> if (itr!=_renderStageMap.end()) 
> { 
> _renderStageMap.erase(cv); 
> } 
> } 
> 
> The call stack at the time of the failed cast is the following… 
> 
> 
> 
> The cv pointer is NULL following the cast. My suspicion is that the dynamic 
> cast is failing because we are in the destructor of our own object that 
> inherits the OSG CullVisitor object. I tested this suspicion by confirming 
> that the same dynamic cast will succeed in application code if done 
> immediately before invoking the destructor of our version of the CullVisitor. 
> This issue is blocking our update to 3.4.0 since it causes numerous unit test 
> failures. 
> 
> Any suggestions on how to address this issue?  
> 
> I created the hack below to temporary bypass the problem… 
> 
> virtual void objectDeleted(void* object) 
> { 
> osg::Referenced* ref = reinterpret_cast<osg::Referenced*>(object); 
> osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(ref); 
> OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex); 
> if (cv != NULL) 
> { 
> RenderStageMap::iterator itr = _renderStageMap.find(cv); 
> if (itr!=_renderStageMap.end()) 
> { 
> _renderStageMap.erase(cv); 
> } 
> } 
> else 
> { 
> for(RenderStageMap::iterator itr = _renderStageMap.begin(); 
> itr != _renderStageMap.end(); 
> ++itr) 
> { 
> osg::Referenced* tmpRef = dynamic_cast<osg::Referenced*>(itr->first); 
> if (ref==tmpRef) 
> { 
> cv = itr->first; 
> _renderStageMap.erase(cv); 
> break; 
> } 
> } 
> } 
> } 
> 
> Thanks, 
> Rick
> 
>  ------------------
> Post generated by Mail2Forum


------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=67211#67211





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to