Gunnar Holm, "After upgrading from 2.8.3 to 3.0.1 we experienced a lock in the Mutex

functionality when using Terrain::setVerticalScale. This was caused by
the following call sequence resulting in a lockup:

void Terrain::setVerticalScale(float scale)
  CALLS    dirtyRegisteredTiles();


void Terrain::dirtyRegisteredTiles(int dirtyMask)
 SETS LOCK    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
 and CALLS (on every tile)   setDirtyMask(dirtyMask);


void TerrainTile::setDirtyMask(int dirtyMask)
 CALLS _terrain->updateTerrainTileOnNextFrame(this);


void Terrain::updateTerrainTileOnNextFrame(TerrainTile* terrainTile)
 SETS LOCK   OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
******* PROBLEM - since lock has already been set! ********


The suggested fix submitted changes from using Mutex to ReentrantMutex.
"
This commit is contained in:
Robert Osfield
2011-12-23 17:34:07 +00:00
parent c7698c1334
commit a53308f7e8
2 changed files with 10 additions and 10 deletions

View File

@@ -15,6 +15,7 @@
#define OSGTerrain 1
#include <osg/CoordinateSystemNode>
#include <OpenThreads/ReentrantMutex>
#include <osgTerrain/TerrainTile>
@@ -109,7 +110,7 @@ class OSGTERRAIN_EXPORT Terrain : public osg::CoordinateSystemNode
TerrainTile::BlendingPolicy _blendingPolicy;
bool _equalizeBoundaries;
mutable OpenThreads::Mutex _mutex;
mutable OpenThreads::ReentrantMutex _mutex;
TerrainTileSet _terrainTileSet;
TerrainTileMap _terrainTileMap;
TerrainTileSet _updateTerrainTileSet;