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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user