Skip to content

Commit 651ccb4

Browse files
committedOct 14, 2018
[GDAL provider] Revise how referencing counting is done on mGdalBaseDataset
initBaseDataset() used to take a reference in the case where mGdalDataset == mGdalBaseDataset (non warped VRT) and we dropped it when closing the dataset, which was OK However buidPyramids() failed to acquire this reference. There was no negative consequence as GDALDerefenceDataset() just decremented a reference count, and GDALClose() ignores it for a non-shared dataset, however this was an incorrected use It is simpler for the mind to call GDALDerefenceDataset() only when mGdalBaseDataset != mGdalDataset.
1 parent e7d15b6 commit 651ccb4

File tree

1 file changed

+8
-12
lines changed

1 file changed

+8
-12
lines changed
 

‎src/providers/gdal/qgsgdalprovider.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ bool QgsGdalProvider::cacheGdalHandlesForLaterReuse( QgsGdalProvider *provider,
392392
{
393393
mgDatasetCacheSize --;
394394
DatasetPair pair = mgDatasetCache[ candidateProvider ].takeLast();
395-
if ( pair.mGdalBaseDataset )
395+
if ( pair.mGdalBaseDataset != pair.mGdalDataset )
396396
{
397397
GDALDereferenceDataset( pair.mGdalBaseDataset );
398398
}
@@ -435,7 +435,7 @@ void QgsGdalProvider::closeCachedGdalHandlesFor( QgsGdalProvider *provider )
435435
{
436436
mgDatasetCacheSize --;
437437
DatasetPair pair = iter.value().takeLast();
438-
if ( pair.mGdalBaseDataset )
438+
if ( pair.mGdalBaseDataset != pair.mGdalDataset )
439439
{
440440
GDALDereferenceDataset( pair.mGdalBaseDataset );
441441
}
@@ -464,7 +464,7 @@ QgsGdalProvider::~QgsGdalProvider()
464464
}
465465
else
466466
{
467-
if ( mGdalBaseDataset )
467+
if ( mGdalBaseDataset != mGdalDataset )
468468
{
469469
GDALDereferenceDataset( mGdalBaseDataset );
470470
}
@@ -498,7 +498,10 @@ void QgsGdalProvider::closeDataset()
498498
}
499499
mValid = false;
500500

501-
GDALDereferenceDataset( mGdalBaseDataset );
501+
if ( mGdalBaseDataset != mGdalDataset )
502+
{
503+
GDALDereferenceDataset( mGdalBaseDataset );
504+
}
502505
mGdalBaseDataset = nullptr;
503506

504507
GDALClose( mGdalDataset );
@@ -2606,7 +2609,6 @@ void QgsGdalProvider::initBaseDataset()
26062609
{
26072610
QgsLogger::warning( QStringLiteral( "Warped VRT Creation failed." ) );
26082611
mGdalDataset = mGdalBaseDataset;
2609-
GDALReferenceDataset( mGdalDataset );
26102612
}
26112613
else
26122614
{
@@ -2616,7 +2618,6 @@ void QgsGdalProvider::initBaseDataset()
26162618
else
26172619
{
26182620
mGdalDataset = mGdalBaseDataset;
2619-
GDALReferenceDataset( mGdalDataset );
26202621
}
26212622

26222623
if ( !hasGeoTransform )
@@ -2645,12 +2646,7 @@ void QgsGdalProvider::initBaseDataset()
26452646
{
26462647
appendError( ERRMSG( tr( "Cannot get GDAL raster band: %1" ).arg( msg ) ) );
26472648

2648-
GDALDereferenceDataset( mGdalBaseDataset );
2649-
mGdalBaseDataset = nullptr;
2650-
2651-
GDALClose( mGdalDataset );
2652-
mGdalDataset = nullptr;
2653-
mValid = false;
2649+
closeDataset();
26542650
return;
26552651
}
26562652
// if there are subdatasets, leave the dataset open for subsequent queries

0 commit comments

Comments
 (0)
Please sign in to comment.