Hi Ola,

I've been doing a code review of Terrain and TerrainTile looking at
how deletion of TerrainTile will affect the internal TerrainTile
pointers held in Terrain that track all the tiles.  There internal
TerrainTile pointers in Terrain are protected by a reentrant mutex but
I believe a problem can occur when the TerrainTile destructor calls
Terrain::unregisterTerrainTile(TerrainTile*) when at the same time the
Terrain::traverse(NodeVisitor&) method is taking a copy of the
_updateTerrainTileSet, when this occurs the update traversal would
increment the ref count on an TerrainTile being destructed by the
DatabasePager thread that is cleaning up expired tiles.

This issue boils down to attempt to make a thread safe list
TerrainTile observers in Terrain that doesn't quite achieve what it
intends.  I haven't thought deeply enough about the issue yet to know
what the best solution will be.  My head isn't quite into zone that
will allow me to solve this one so I'll have to come back to it at a
later date.  A short term solution would be set the pager so that it
doesn't delete objects in a background pager thread via
DatabasePager::setDeleteRemovedSubgraphsInDatabaseThread(false), this
won't fix the thread safety issue but will at least prevent the
particular instance where the update traversal is occurring at the
same time as the deletion of TerrainTile.

Robert.
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to