[osg-users] CullVisitor object not getting properly deleted
Rick Irons
Rick.Irons at mathworks.com
Fri May 27 15:32:21 PDT 2016
Hi Robert,
Your most recent changes addressed the crash we were encountering. Thanks for looking into this issue.
Rick
-----Original Message-----
From: osg-users [mailto:osg-users-bounces at lists.openscenegraph.org] On Behalf Of Robert Osfield
Sent: Friday, May 27, 2016 4:50 AM
To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org>
Subject: Re: [osg-users] CullVisitor object not getting properly deleted
Hi Rick,
Just tried, static_cast<> isn't usable in this instance thank to the use of virtual inheritance.
So the solution I have gone for is refactor the RenderStageCache so that it uses a map<Referenced*, ref_ptr<RenderStage>> in place of map<CullVisitor*, ref_ptr<RenderStage>>, this means the cast happens when the map is set up and no dynamic_cast<> need be done anywhere.
The changes are:
diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index d198b78..3112cdf 100644
--- a/src/osgUtil/CullVisitor.cpp
+++ b/src/osgUtil/CullVisitor.cpp
@@ -1368,7 +1368,7 @@ class RenderStageCache : public osg::Object, public osg::Observer {
public:
- typedef std::map<CullVisitor*, osg::ref_ptr<RenderStage> >
RenderStageMap;
+ typedef std::map<osg::Referenced*, osg::ref_ptr<RenderStage>
> RenderStageMap;
RenderStageCache() {}
RenderStageCache(const RenderStageCache&, const osg::CopyOp&) {} @@ -1387,18 +1387,17 @@ class RenderStageCache : public osg::Object, public osg::Observer
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);
+ RenderStageMap::iterator itr = _renderStageMap.find(ref);
if (itr!=_renderStageMap.end())
{
_renderStageMap.erase(itr);
}
}
- void setRenderStage(CullVisitor* cv, RenderStage* rs)
+ void setRenderStage(osg::Referenced* cv, RenderStage* rs)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
RenderStageMap::iterator itr = _renderStageMap.find(cv); @@ -1414,7 +1413,7 @@ class RenderStageCache : public osg::Object, public osg::Observer
}
- RenderStage* getRenderStage(osgUtil::CullVisitor* cv)
+ RenderStage* getRenderStage(osg::Referenced* cv)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
RenderStageMap::iterator itr = _renderStageMap.find(cv);
I have checked this fix into OSG master and 3.4 branch. Commit is
110cf56..31592d2
Could you let me know how this works out, if it fails I'm afraid I'll need a small test example to reproduce it as the osgoi and osgprerender examples I'm using are working 100% OK.
Robert.
On 27 May 2016 at 09:01, Robert Osfield <robert.osfield at gmail.com> wrote:
> Hi Rick,
>
> As general note, use of a C pointer to scene graph objects include the
> CullVisitor should generally be avoided, it's only safe for small
> blocks of code where you know that the objects will remain in memory
> at all times during the block. Instead you should use ref_ptr<> to
> make sure it's lifetime is correct - if in doubt use ref_ptr<>.
>
> I will have a look at the use of dynamic_cast<> again. I had to keep
> it in there because the pointer to the Referenced base class isn't
> castable directly to a CullVsititor as CullVisitor uses virtual
> inheritance.
>
> Robert.
>
>
> On 26 May 2016 at 22:04, Rick Irons <Rick.Irons at mathworks.com> wrote:
>> Hi Robert,
>>
>>
>>
>> Unfortunately the fix didn't address the crash I am encountering.
>> The issue of the dynamic cast in objectDeleted()
>> (\openscenegraph\src\osgUtil\CullVisitor.cpp) failing remains...
>>
>>
>>
>> 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(itr);
>>
>> }
>>
>> }
>>
>>
>>
>> I was going to define our object that inherits from the CullVisitor
>> as an osg::ref_ptr. Perhaps doing so will delay the freeing of the
>> CullVisitor object long enough within the CullVisitor destructor so
>> that the problematic dynamic cast will succeed. I am open to any
>> other suggestions as well. I may have to resort to just creating a
>> small example program that reproduces the issue.
>>
>>
>>
>> Thanks,
>>
>> Rick
>>
>>
>>
>> -----Original Message-----
>> From: Rick Irons
>> Sent: Wednesday, May 25, 2016 5:56 AM
>> To: OpenSceneGraph Users <osg-users at lists.openscenegraph.org>
>> Subject: Re: [osg-users] CullVisitor object not getting properly
>> deleted
>>
>>
>>
>> Hi Robert,
>>
>>
>>
>> Thanks for the update. I will try out the fix.
>>
>>
>>
>> Rick
>>
>>
>>
>>> On May 24, 2016, at 3:53 PM, Robert Osfield
>>> <robert.osfield at gmail.com>
>>> wrote:
>>
>>>
>>
>>> Hi Rick,
>>
>>>
>>
>>> After a preplexing day looking at how the osgUtiil::CullVisitor,
>>
>>> osg::Camera and RenderStageCache were all interacting via the
>>
>>> osg::Observer system I finally fixed the problem with the crash that
>>
>>> I've see with the osgoit and osgprerender examples. As the crash
>>
>>> looks similar to what you saw there is reasonable chance that the
>>
>>> changes should work for you too.
>>
>>>
>>
>>> I have checked my fix into master and OpenSceneGraph-3.4.
>>
>>>
>>
>>> Robert.
>>
>>> _______________________________________________
>>
>>> osg-users mailing list
>>
>>> osg-users at lists.openscenegraph.org
>>
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.
>>
>>> org
>>
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph
>> .org
>>
_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
More information about the osg-users
mailing list