Skip to content

Commit 1f02b42

Browse files
committedOct 8, 2018
Fix race condition causing crash on startup
Also flick more static list initializations across to nicer std::call_once implimentations
1 parent ee7ca0a commit 1f02b42

File tree

4 files changed

+19
-20
lines changed

4 files changed

+19
-20
lines changed
 

‎src/core/qgsdataitem.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,10 +1334,11 @@ void QgsZipItem::init()
13341334
mIconName = QStringLiteral( "/mIconZip.svg" );
13351335
mVsiPrefix = vsiPrefix( mFilePath );
13361336

1337-
if ( sProviderNames.isEmpty() )
1337+
static std::once_flag initialized;
1338+
std::call_once( initialized, [ = ]
13381339
{
13391340
sProviderNames << QStringLiteral( "OGR" ) << QStringLiteral( "GDAL" );
1340-
}
1341+
} );
13411342
}
13421343

13431344
QVector<QgsDataItem *> QgsZipItem::createChildren()

‎src/core/qgsvectordataprovider.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "qgslogger.h"
3434
#include "qgsmessagelog.h"
3535
#include "qgssettings.h"
36+
#include <mutex>
3637

3738
QgsVectorDataProvider::QgsVectorDataProvider( const QString &uri, const ProviderOptions &options )
3839
: QgsDataProvider( uri, options )
@@ -605,7 +606,8 @@ static bool _compareEncodings( const QString &s1, const QString &s2 )
605606

606607
QStringList QgsVectorDataProvider::availableEncodings()
607608
{
608-
if ( sEncodings.isEmpty() )
609+
static std::once_flag initialized;
610+
std::call_once( initialized, [ = ]
609611
{
610612
Q_FOREACH ( const QString &codec, QTextCodec::availableCodecs() )
611613
{
@@ -658,10 +660,11 @@ QStringList QgsVectorDataProvider::availableEncodings()
658660
smEncodings << "TIS-620";
659661
smEncodings << "System";
660662
#endif
661-
}
662663

663-
// Do case-insensitive sorting of encodings
664-
std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
664+
// Do case-insensitive sorting of encodings
665+
std::sort( sEncodings.begin(), sEncodings.end(), _compareEncodings );
666+
667+
} );
665668

666669
return sEncodings;
667670
}

‎src/providers/gdal/qgsgdaldataitems.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,13 @@ QgsDataItem *QgsGdalDataItemProvider::createDataItem( const QString &pathIn, Qgs
184184
return nullptr;
185185

186186
// get supported extensions
187-
if ( sExtensions.isEmpty() )
187+
static std::once_flag initialized;
188+
std::call_once( initialized, [ = ]
188189
{
189-
// this code may be executed by more threads at once!
190-
// use a mutex to make sure this does not happen (so there's no crash on start)
191-
QMutexLocker locker( &sBuildingFilters );
192-
if ( sExtensions.isEmpty() )
193-
{
194-
buildSupportedRasterFileFilterAndExtensions( sFilterString, sExtensions, sWildcards );
195-
QgsDebugMsgLevel( "extensions: " + sExtensions.join( " " ), 2 );
196-
QgsDebugMsgLevel( "wildcards: " + sWildcards.join( " " ), 2 );
197-
}
198-
}
190+
buildSupportedRasterFileFilterAndExtensions( sFilterString, sExtensions, sWildcards );
191+
QgsDebugMsgLevel( "extensions: " + sExtensions.join( " " ), 2 );
192+
QgsDebugMsgLevel( "wildcards: " + sWildcards.join( " " ), 2 );
193+
} );
199194

200195
// skip *.aux.xml files (GDAL auxiliary metadata files),
201196
// *.shp.xml files (ESRI metadata) and *.tif.xml files (TIFF metadata)

‎src/providers/mdal/qgsmdaldataitems.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
6060
if ( !info.isFile() )
6161
return nullptr;
6262

63-
// get supported extensions
64-
if ( sExtensions.isEmpty() )
63+
static std::once_flag initialized;
64+
std::call_once( initialized, [ = ]( )
6565
{
6666
// TODO ask MDAL for extensions !
6767
sExtensions << QStringLiteral( "2dm" )
@@ -72,7 +72,7 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
7272
<< QStringLiteral( "grib1" )
7373
<< QStringLiteral( "grib2" )
7474
<< QStringLiteral( "nc" );
75-
}
75+
} );
7676

7777
// Filter files by extension
7878
if ( !sExtensions.contains( suffix ) )

0 commit comments

Comments
 (0)
Please sign in to comment.