Skip to content

Commit 348088e

Browse files
committedJul 10, 2017
Add an assert to protect multiple calls to QgsSymbolV2::startRender()
while rendering has already been started for a particular symbol instance Relates to a random but frequent crash which occurs when using the categorised symbol renderer - tracked down to a race condition in which multiple concurrent calls to startRender() are performed on a single symbol instance.
1 parent e6dc103 commit 348088e

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed
 

‎src/core/symbology-ng/qgssymbolv2.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ QgsSymbolV2::QgsSymbolV2( SymbolType type, const QgsSymbolLayerV2List& layers )
8989
, mRenderHints( 0 )
9090
, mClipFeaturesToExtent( true )
9191
, mLayer( nullptr )
92+
, mStarted( false )
9293
, mSymbolRenderContext( nullptr )
9394
{
94-
9595
// check they're all correct symbol layers
9696
for ( int i = 0; i < mLayers.count(); i++ )
9797
{
@@ -444,6 +444,9 @@ bool QgsSymbolV2::changeSymbolLayer( int index, QgsSymbolLayerV2* layer )
444444

445445
void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsFields* fields )
446446
{
447+
Q_ASSERT_X( !mStarted, "startRender", "Rendering has already been started for this symbol instance!" );
448+
449+
mStarted = true;
447450
delete mSymbolRenderContext;
448451
mSymbolRenderContext = new QgsSymbolV2RenderContext( context, outputUnit(), mAlpha, false, mRenderHints, nullptr, fields, mapUnitScale() );
449452

@@ -459,6 +462,9 @@ void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsFields* field
459462

460463
void QgsSymbolV2::stopRender( QgsRenderContext& context )
461464
{
465+
Q_ASSERT_X( mStarted, "startRender", "startRender was not called for this symbol instance!" );
466+
mStarted = false;
467+
462468
Q_UNUSED( context )
463469
if ( mSymbolRenderContext )
464470
{

‎src/core/symbology-ng/qgssymbolv2.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,9 @@ class CORE_EXPORT QgsSymbolV2
335335
const QgsVectorLayer* mLayer; //current vectorlayer
336336

337337
private:
338+
//! True if render has already been started - guards against multiple calls to
339+
//! startRender() (usually a result of not cloning a shared symbol instance before rendering).
340+
bool mStarted;
338341
//! Initialized in startRender, destroyed in stopRender
339342
QgsSymbolV2RenderContext* mSymbolRenderContext;
340343

0 commit comments

Comments
 (0)
Please sign in to comment.