Skip to content

Commit 39fa842

Browse files
committed
Fix leak of label engine when start called on single render job multiple times
1 parent 42ec4e6 commit 39fa842

8 files changed

+23
-42
lines changed

src/core/qgslabelingengine.cpp

+3-8
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,11 @@ QgsLabelingEngine::QgsLabelingEngine()
7777
, mCandPoint( 16 )
7878
, mCandLine( 50 )
7979
, mCandPolygon( 30 )
80-
, mResults( nullptr )
81-
{
82-
mResults = new QgsLabelingResults;
83-
}
80+
, mResults( new QgsLabelingResults )
81+
{}
8482

8583
QgsLabelingEngine::~QgsLabelingEngine()
8684
{
87-
delete mResults;
8885
qDeleteAll( mProviders );
8986
qDeleteAll( mSubProviders );
9087
}
@@ -358,9 +355,7 @@ void QgsLabelingEngine::run( QgsRenderContext& context )
358355

359356
QgsLabelingResults* QgsLabelingEngine::takeResults()
360357
{
361-
QgsLabelingResults* res = mResults;
362-
mResults = nullptr;
363-
return res;
358+
return mResults.release();
364359
}
365360

366361

src/core/qgslabelingengine.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class CORE_EXPORT QgsLabelingEngine
210210
QgsLabelingResults* takeResults();
211211

212212
//! For internal use by the providers
213-
QgsLabelingResults* results() const { return mResults; }
213+
QgsLabelingResults* results() const { return mResults.get(); }
214214

215215
//! Set flags of the labeling engine
216216
void setFlags( Flags flags ) { mFlags = flags; }
@@ -255,7 +255,7 @@ class CORE_EXPORT QgsLabelingEngine
255255
int mCandPoint, mCandLine, mCandPolygon;
256256

257257
//! Resulting labeling layout
258-
QgsLabelingResults* mResults;
258+
std::unique_ptr< QgsLabelingResults > mResults;
259259

260260
};
261261

src/core/qgsmaprenderercustompainterjob.cpp

+6-11
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
QgsMapRendererCustomPainterJob::QgsMapRendererCustomPainterJob( const QgsMapSettings& settings, QPainter* painter )
2929
: QgsMapRendererJob( settings )
3030
, mPainter( painter )
31-
, mLabelingEngineV2( nullptr )
3231
, mActive( false )
3332
, mRenderSynchronously( false )
3433
{
@@ -40,9 +39,6 @@ QgsMapRendererCustomPainterJob::~QgsMapRendererCustomPainterJob()
4039
QgsDebugMsg( "QPAINTER destruct" );
4140
Q_ASSERT( !mFutureWatcher.isRunning() );
4241
//cancel();
43-
44-
delete mLabelingEngineV2;
45-
mLabelingEngineV2 = nullptr;
4642
}
4743

4844
void QgsMapRendererCustomPainterJob::start()
@@ -73,19 +69,18 @@ void QgsMapRendererCustomPainterJob::start()
7369
Q_ASSERT_X( qgsDoubleNear( thePaintDevice->logicalDpiX(), mSettings.outputDpi() ), "Job::startRender()", errMsg.toLatin1().data() );
7470
#endif
7571

76-
delete mLabelingEngineV2;
77-
mLabelingEngineV2 = nullptr;
72+
mLabelingEngineV2.reset();
7873

7974
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) )
8075
{
81-
mLabelingEngineV2 = new QgsLabelingEngine();
76+
mLabelingEngineV2.reset( new QgsLabelingEngine() );
8277
mLabelingEngineV2->readSettingsFromProject( QgsProject::instance() );
8378
mLabelingEngineV2->setMapSettings( mSettings );
8479
}
8580

8681
bool canUseLabelCache = prepareLabelCache();
87-
mLayerJobs = prepareJobs( mPainter, mLabelingEngineV2 );
88-
mLabelJob = prepareLabelingJob( mPainter, mLabelingEngineV2, canUseLabelCache );
82+
mLayerJobs = prepareJobs( mPainter, mLabelingEngineV2.get() );
83+
mLabelJob = prepareLabelingJob( mPainter, mLabelingEngineV2.get(), canUseLabelCache );
8984

9085
QgsDebugMsg( "Rendering prepared in (seconds): " + QString( "%1" ).arg( prepareTime.elapsed() / 1000.0 ) );
9186

@@ -284,12 +279,12 @@ void QgsMapRendererCustomPainterJob::doRender()
284279
mLabelJob.img->fill( 0 );
285280
painter.begin( mLabelJob.img );
286281
mLabelJob.context.setPainter( &painter );
287-
drawLabeling( mSettings, mLabelJob.context, mLabelingEngineV2, &painter );
282+
drawLabeling( mSettings, mLabelJob.context, mLabelingEngineV2.get(), &painter );
288283
painter.end();
289284
}
290285
else
291286
{
292-
drawLabeling( mSettings, mLabelJob.context, mLabelingEngineV2, mPainter );
287+
drawLabeling( mSettings, mLabelJob.context, mLabelingEngineV2.get(), mPainter );
293288
}
294289

295290
mLabelJob.complete = true;

src/core/qgsmaprenderercustompainterjob.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class CORE_EXPORT QgsMapRendererCustomPainterJob : public QgsMapRendererJob
8484
QPainter* mPainter;
8585
QFuture<void> mFuture;
8686
QFutureWatcher<void> mFutureWatcher;
87-
QgsLabelingEngine* mLabelingEngineV2;
87+
std::unique_ptr< QgsLabelingEngine > mLabelingEngineV2;
8888

8989
bool mActive;
9090
LayerRenderJobs mLayerJobs;

src/core/qgsmaprendererparalleljob.cpp

+5-10
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
QgsMapRendererParallelJob::QgsMapRendererParallelJob( const QgsMapSettings& settings )
3030
: QgsMapRendererQImageJob( settings )
3131
, mStatus( Idle )
32-
, mLabelingEngineV2( nullptr )
3332
{
3433
}
3534

@@ -39,9 +38,6 @@ QgsMapRendererParallelJob::~QgsMapRendererParallelJob()
3938
{
4039
cancel();
4140
}
42-
43-
delete mLabelingEngineV2;
44-
mLabelingEngineV2 = nullptr;
4541
}
4642

4743
void QgsMapRendererParallelJob::start()
@@ -53,19 +49,18 @@ void QgsMapRendererParallelJob::start()
5349

5450
mStatus = RenderingLayers;
5551

56-
delete mLabelingEngineV2;
57-
mLabelingEngineV2 = nullptr;
52+
mLabelingEngineV2.reset();
5853

5954
if ( mSettings.testFlag( QgsMapSettings::DrawLabeling ) )
6055
{
61-
mLabelingEngineV2 = new QgsLabelingEngine();
56+
mLabelingEngineV2.reset( new QgsLabelingEngine() );
6257
mLabelingEngineV2->readSettingsFromProject( QgsProject::instance() );
6358
mLabelingEngineV2->setMapSettings( mSettings );
6459
}
6560

6661
bool canUseLabelCache = prepareLabelCache();
67-
mLayerJobs = prepareJobs( nullptr, mLabelingEngineV2 );
68-
mLabelJob = prepareLabelingJob( nullptr, mLabelingEngineV2, canUseLabelCache );
62+
mLayerJobs = prepareJobs( nullptr, mLabelingEngineV2.get() );
63+
mLabelJob = prepareLabelingJob( nullptr, mLabelingEngineV2.get(), canUseLabelCache );
6964

7065
QgsDebugMsg( QString( "QThreadPool max thread count is %1" ).arg( QThreadPool::globalInstance()->maxThreadCount() ) );
7166

@@ -280,7 +275,7 @@ void QgsMapRendererParallelJob::renderLabelsStatic( QgsMapRendererParallelJob* s
280275
// draw the labels!
281276
try
282277
{
283-
drawLabeling( self->mSettings, job.context, self->mLabelingEngineV2, &painter );
278+
drawLabeling( self->mSettings, job.context, self->mLabelingEngineV2.get(), &painter );
284279
}
285280
catch ( QgsException & e )
286281
{

src/core/qgsmaprendererparalleljob.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class CORE_EXPORT QgsMapRendererParallelJob : public QgsMapRendererQImageJob
7070
LabelRenderJob mLabelJob;
7171

7272
//! New labeling engine
73-
QgsLabelingEngine* mLabelingEngineV2;
73+
std::unique_ptr< QgsLabelingEngine > mLabelingEngineV2;
7474
QFuture<void> mLabelingFuture;
7575
QFutureWatcher<void> mLabelingFutureWatcher;
7676

src/core/qgsmaprenderersequentialjob.cpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ QgsMapRendererSequentialJob::QgsMapRendererSequentialJob( const QgsMapSettings&
2323
: QgsMapRendererQImageJob( settings )
2424
, mInternalJob( nullptr )
2525
, mPainter( nullptr )
26-
, mLabelingResults( nullptr )
2726
{
2827
QgsDebugMsg( "SEQUENTIAL construct" );
2928

@@ -44,9 +43,6 @@ QgsMapRendererSequentialJob::~QgsMapRendererSequentialJob()
4443
}
4544

4645
Q_ASSERT( !mInternalJob && !mPainter );
47-
48-
delete mLabelingResults;
49-
mLabelingResults = nullptr;
5046
}
5147

5248

@@ -55,6 +51,8 @@ void QgsMapRendererSequentialJob::start()
5551
if ( isActive() )
5652
return; // do nothing if we are already running
5753

54+
mLabelingResults.reset();
55+
5856
mRenderingStart.start();
5957

6058
mErrors.clear();
@@ -105,9 +103,7 @@ bool QgsMapRendererSequentialJob::usedCachedLabels() const
105103

106104
QgsLabelingResults* QgsMapRendererSequentialJob::takeLabelingResults()
107105
{
108-
QgsLabelingResults* tmp = mLabelingResults;
109-
mLabelingResults = nullptr;
110-
return tmp;
106+
return mLabelingResults.release();
111107
}
112108

113109

@@ -129,7 +125,7 @@ void QgsMapRendererSequentialJob::internalFinished()
129125
delete mPainter;
130126
mPainter = nullptr;
131127

132-
mLabelingResults = mInternalJob->takeLabelingResults();
128+
mLabelingResults.reset( mInternalJob->takeLabelingResults() );
133129
mUsedCachedLabels = mInternalJob->usedCachedLabels();
134130

135131
mErrors = mInternalJob->errors();

src/core/qgsmaprenderersequentialjob.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class CORE_EXPORT QgsMapRendererSequentialJob : public QgsMapRendererQImageJob
5656
QgsMapRendererCustomPainterJob* mInternalJob;
5757
QImage mImage;
5858
QPainter* mPainter;
59-
QgsLabelingResults* mLabelingResults;
59+
std::unique_ptr< QgsLabelingResults > mLabelingResults;
6060
bool mUsedCachedLabels = false;
6161

6262
};

0 commit comments

Comments
 (0)