Avoid some other lengthy lambdas in call_once

This commit is contained in:
Nyall Dawson 2025-05-29 10:53:23 +10:00
parent 7906258d01
commit 8159590ecf
6 changed files with 136 additions and 147 deletions

View File

@ -194,10 +194,7 @@ void QgsCallout::setEnabled( bool enabled )
QgsPropertiesDefinition QgsCallout::propertyDefinitions()
{
static std::once_flag initialized;
std::call_once( initialized, [ = ]( )
{
initPropertyDefinitions();
} );
std::call_once( initialized, initPropertyDefinitions );
return sPropertyDefinitions;
}

View File

@ -123,75 +123,76 @@ void QgsNetworkDiskCache::clear()
return sDiskCache.clear();
}
qint64 QgsNetworkDiskCache::smartCacheSize( const QString &cacheDir )
void determineSmartCacheSize( const QString &cacheDir, qint64 &cacheSize )
{
static qint64 cacheSize = 0;
static std::once_flag initialized;
std::call_once( initialized, [ = ]
std::function<qint64( const QString & )> dirSize;
dirSize = [&dirSize]( const QString & dirPath ) -> qint64
{
std::function<qint64( const QString & )> dirSize;
dirSize = [&dirSize]( const QString & dirPath ) -> qint64
qint64 size = 0;
QDir dir( dirPath );
const QStringList filePaths = dir.entryList( QDir::Files | QDir::System | QDir::Hidden );
for ( const QString &filePath : filePaths )
{
qint64 size = 0;
QDir dir( dirPath );
const QStringList filePaths = dir.entryList( QDir::Files | QDir::System | QDir::Hidden );
for ( const QString &filePath : filePaths )
{
QFileInfo fi( dir, filePath );
size += fi.size();
}
const QStringList childDirPaths = dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::NoSymLinks );
for ( const QString &childDirPath : childDirPaths )
{
size += dirSize( dirPath + QDir::separator() + childDirPath );
}
return size;
};
qint64 bytesFree;
QStorageInfo storageInfo( cacheDir );
bytesFree = storageInfo.bytesFree() + dirSize( cacheDir );
// NOLINTBEGIN(bugprone-narrowing-conversions)
// Logic taken from Firefox's smart cache size handling
qint64 available10MB = bytesFree / 1024 / ( 1024LL * 10 );
qint64 cacheSize10MB = 0;
if ( available10MB > 2500 )
{
// Cap the cache size to 1GB
cacheSize10MB = 100;
QFileInfo fi( dir, filePath );
size += fi.size();
}
else
const QStringList childDirPaths = dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::NoSymLinks );
for ( const QString &childDirPath : childDirPaths )
{
if ( available10MB > 700 )
{
// Add 2.5% of the free space above 7GB
cacheSize10MB += ( available10MB - 700 ) * 0.025;
available10MB = 700;
}
if ( available10MB > 50 )
{
// Add 7.5% of free space between 500MB to 7GB
cacheSize10MB += ( available10MB - 50 ) * 0.075;
available10MB = 50;
}
size += dirSize( dirPath + QDir::separator() + childDirPath );
}
return size;
};
qint64 bytesFree;
QStorageInfo storageInfo( cacheDir );
bytesFree = storageInfo.bytesFree() + dirSize( cacheDir );
// NOLINTBEGIN(bugprone-narrowing-conversions)
// Logic taken from Firefox's smart cache size handling
qint64 available10MB = bytesFree / 1024 / ( 1024LL * 10 );
qint64 cacheSize10MB = 0;
if ( available10MB > 2500 )
{
// Cap the cache size to 1GB
cacheSize10MB = 100;
}
else
{
if ( available10MB > 700 )
{
// Add 2.5% of the free space above 7GB
cacheSize10MB += ( available10MB - 700 ) * 0.025;
available10MB = 700;
}
if ( available10MB > 50 )
{
// Add 7.5% of free space between 500MB to 7GB
cacheSize10MB += ( available10MB - 50 ) * 0.075;
available10MB = 50;
}
#if defined( Q_OS_ANDROID )
// On Android, smaller/older devices may have very little storage
// On Android, smaller/older devices may have very little storage
// Add 16% of free space up to 500 MB
cacheSize10MB += std::max( 2LL, static_cast<qint64>( available10MB * 0.16 ) );
#else
// Add 30% of free space up to 500 MB
cacheSize10MB += std::max( 5LL, static_cast<qint64>( available10MB * 0.30 ) );
// Add 16% of free space up to 500 MB
cacheSize10MB += std::max( 2LL, static_cast<qint64>( available10MB * 0.16 ) );
#else \
// Add 30% of free space up to 500 MB
cacheSize10MB += std::max( 5LL, static_cast<qint64>( available10MB * 0.30 ) );
#endif
}
cacheSize = cacheSize10MB * 10 * 1024 * 1024;
// NOLINTEND(bugprone-narrowing-conversions)
} );
return cacheSize;
}
cacheSize = cacheSize10MB * 10 * 1024 * 1024;
// NOLINTEND(bugprone-narrowing-conversions)
}
qint64 QgsNetworkDiskCache::smartCacheSize( const QString &cacheDir )
{
static qint64 sCacheSize = 0;
static std::once_flag initialized;
std::call_once( initialized, determineSmartCacheSize, cacheDir, sCacheSize );
return sCacheSize;
}

View File

@ -2961,7 +2961,7 @@ void buildSupportedRasterFileFilterAndExtensions( QString &fileFiltersString, QS
QgsDebugMsgLevel( "Raster filter list built: " + fileFiltersString, 2 );
QgsDebugMsgLevel( "Raster extension list built: " + extensions.join( ' ' ), 2 );
} // buildSupportedRasterFileFilter_()
}
bool QgsGdalProvider::isValidRasterFileName( QString const &fileNameQString, QString &retErrMsg )
{
@ -4429,12 +4429,7 @@ QList<QgsProviderSublayerDetails> QgsGdalProviderMetadata::querySublayers( const
// get supported extensions
static std::once_flag initialized;
std::call_once( initialized, [ = ]
{
buildSupportedRasterFileFilterAndExtensions( sFilterString, sExtensions, sWildcards );
QgsDebugMsgLevel( QStringLiteral( "extensions: " ) + sExtensions.join( ' ' ), 2 );
QgsDebugMsgLevel( QStringLiteral( "wildcards: " ) + sWildcards.join( ' ' ), 2 );
} );
std::call_once( initialized, buildSupportedRasterFileFilterAndExtensions, sFilterString, sExtensions, sWildcards );
const QString suffix = uriParts.value( QStringLiteral( "vsiSuffix" ) ).toString().isEmpty()
? pathInfo.suffix().toLower()

View File

@ -226,6 +226,73 @@ QgsApplication::QgsApplication( int &argc, char **argv, bool GUIenabled, const Q
}
void registerMetaTypes()
{
qRegisterMetaType<QgsGeometry::Error>( "QgsGeometry::Error" );
qRegisterMetaType<QgsDatabaseQueryLogEntry>( "QgsDatabaseQueryLogEntry" );
qRegisterMetaType<QgsProcessingFeatureSourceDefinition>( "QgsProcessingFeatureSourceDefinition" );
qRegisterMetaType<QgsProcessingOutputLayerDefinition>( "QgsProcessingOutputLayerDefinition" );
qRegisterMetaType<Qgis::LayoutUnit>( "Qgis::LayoutUnit" );
qRegisterMetaType<QgsUnsetAttributeValue>( "QgsUnsetAttributeValue" );
qRegisterMetaType<QgsFeatureId>( "QgsFeatureId" );
qRegisterMetaType<QgsFields>( "QgsFields" );
qRegisterMetaType<QgsFeatureIds>( "QgsFeatureIds" );
qRegisterMetaType<QgsProperty>( "QgsProperty" );
qRegisterMetaType<QgsFeatureStoreList>( "QgsFeatureStoreList" );
qRegisterMetaType<Qgis::MessageLevel>( "Qgis::MessageLevel" );
qRegisterMetaType<Qgis::BrowserItemState>( "Qgis::BrowserItemState" );
qRegisterMetaType<Qgis::GpsFixStatus>( "Qgis::GpsFixStatus" );
qRegisterMetaType<QgsReferencedRectangle>( "QgsReferencedRectangle" );
qRegisterMetaType<QgsReferencedPointXY>( "QgsReferencedPointXY" );
qRegisterMetaType<QgsReferencedGeometry>( "QgsReferencedGeometry" );
qRegisterMetaType<QgsLayoutRenderContext::Flags>( "QgsLayoutRenderContext::Flags" );
qRegisterMetaType<QgsStyle::StyleEntity>( "QgsStyle::StyleEntity" );
qRegisterMetaType<QgsCoordinateReferenceSystem>( "QgsCoordinateReferenceSystem" );
qRegisterMetaType<QgsAuthManager::MessageLevel>( "QgsAuthManager::MessageLevel" );
qRegisterMetaType<QgsNetworkRequestParameters>( "QgsNetworkRequestParameters" );
qRegisterMetaType<QgsNetworkReplyContent>( "QgsNetworkReplyContent" );
qRegisterMetaType<QgsFeature>( "QgsFeature" );
qRegisterMetaType<QgsGeometry>( "QgsGeometry" );
qRegisterMetaType<QgsInterval>( "QgsInterval" );
qRegisterMetaType<QgsRectangle>( "QgsRectangle" );
qRegisterMetaType<QgsPointXY>( "QgsPointXY" );
qRegisterMetaType<QgsPoint>( "QgsPoint" );
qRegisterMetaType<QgsDatumTransform::GridDetails>( "QgsDatumTransform::GridDetails" );
qRegisterMetaType<QgsDatumTransform::TransformDetails>( "QgsDatumTransform::TransformDetails" );
qRegisterMetaType<QgsNewsFeedParser::Entry>( "QgsNewsFeedParser::Entry" );
qRegisterMetaType<QgsRectangle>( "QgsRectangle" );
qRegisterMetaType<QgsLocatorResult>( "QgsLocatorResult" );
qRegisterMetaType<QgsGradientColorRamp>( "QgsGradientColorRamp" );
qRegisterMetaType<QgsProcessingModelChildParameterSource>( "QgsProcessingModelChildParameterSource" );
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// Qt6 documentation says these are not needed anymore (https://www.qt.io/blog/whats-new-in-qmetatype-qvariant) #spellok
// TODO: when tests can run against Qt6 builds, check for any regressions
qRegisterMetaTypeStreamOperators<QgsProcessingModelChildParameterSource>( "QgsProcessingModelChildParameterSource" );
#endif
qRegisterMetaType<QgsRemappingSinkDefinition>( "QgsRemappingSinkDefinition" );
qRegisterMetaType<QgsProcessingModelChildDependency>( "QgsProcessingModelChildDependency" );
qRegisterMetaType<QgsTextFormat>( "QgsTextFormat" );
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QMetaType::registerComparators<QgsProcessingModelChildDependency>();
QMetaType::registerEqualsComparator<QgsProcessingFeatureSourceDefinition>();
QMetaType::registerEqualsComparator<QgsProperty>();
QMetaType::registerEqualsComparator<QgsDateTimeRange>();
QMetaType::registerEqualsComparator<QgsDateRange>();
QMetaType::registerEqualsComparator<QgsUnsetAttributeValue>();
#endif
qRegisterMetaType<QPainter::CompositionMode>( "QPainter::CompositionMode" );
qRegisterMetaType<QgsDateTimeRange>( "QgsDateTimeRange" );
qRegisterMetaType<QgsDoubleRange>( "QgsDoubleRange" );
qRegisterMetaType<QgsIntRange>( "QgsIntRange" );
qRegisterMetaType<QList<QgsMapLayer *>>( "QList<QgsMapLayer*>" );
qRegisterMetaType<QMap<QNetworkRequest::Attribute, QVariant>>( "QMap<QNetworkRequest::Attribute,QVariant>" );
qRegisterMetaType<QMap<QNetworkRequest::KnownHeaders, QVariant>>( "QMap<QNetworkRequest::KnownHeaders,QVariant>" );
qRegisterMetaType<QList<QNetworkReply::RawHeaderPair>>( "QList<QNetworkReply::RawHeaderPair>" );
qRegisterMetaType< QAuthenticator * >( "QAuthenticator*" );
qRegisterMetaType< QgsGpsInformation >( "QgsGpsInformation" );
qRegisterMetaType< QgsSensorThingsExpansionDefinition >( "QgsSensorThingsExpansionDefinition" );
};
void QgsApplication::init( QString profileFolder )
{
// Initialize application members in desktop app (at this point, profile folder is known)
@ -257,72 +324,7 @@ void QgsApplication::init( QString profileFolder )
*sProfilePath() = profileFolder;
static std::once_flag sMetaTypesRegistered;
std::call_once( sMetaTypesRegistered, []
{
qRegisterMetaType<QgsGeometry::Error>( "QgsGeometry::Error" );
qRegisterMetaType<QgsDatabaseQueryLogEntry>( "QgsDatabaseQueryLogEntry" );
qRegisterMetaType<QgsProcessingFeatureSourceDefinition>( "QgsProcessingFeatureSourceDefinition" );
qRegisterMetaType<QgsProcessingOutputLayerDefinition>( "QgsProcessingOutputLayerDefinition" );
qRegisterMetaType<Qgis::LayoutUnit>( "Qgis::LayoutUnit" );
qRegisterMetaType<QgsUnsetAttributeValue>( "QgsUnsetAttributeValue" );
qRegisterMetaType<QgsFeatureId>( "QgsFeatureId" );
qRegisterMetaType<QgsFields>( "QgsFields" );
qRegisterMetaType<QgsFeatureIds>( "QgsFeatureIds" );
qRegisterMetaType<QgsProperty>( "QgsProperty" );
qRegisterMetaType<QgsFeatureStoreList>( "QgsFeatureStoreList" );
qRegisterMetaType<Qgis::MessageLevel>( "Qgis::MessageLevel" );
qRegisterMetaType<Qgis::BrowserItemState>( "Qgis::BrowserItemState" );
qRegisterMetaType<Qgis::GpsFixStatus>( "Qgis::GpsFixStatus" );
qRegisterMetaType<QgsReferencedRectangle>( "QgsReferencedRectangle" );
qRegisterMetaType<QgsReferencedPointXY>( "QgsReferencedPointXY" );
qRegisterMetaType<QgsReferencedGeometry>( "QgsReferencedGeometry" );
qRegisterMetaType<QgsLayoutRenderContext::Flags>( "QgsLayoutRenderContext::Flags" );
qRegisterMetaType<QgsStyle::StyleEntity>( "QgsStyle::StyleEntity" );
qRegisterMetaType<QgsCoordinateReferenceSystem>( "QgsCoordinateReferenceSystem" );
qRegisterMetaType<QgsAuthManager::MessageLevel>( "QgsAuthManager::MessageLevel" );
qRegisterMetaType<QgsNetworkRequestParameters>( "QgsNetworkRequestParameters" );
qRegisterMetaType<QgsNetworkReplyContent>( "QgsNetworkReplyContent" );
qRegisterMetaType<QgsFeature>( "QgsFeature" );
qRegisterMetaType<QgsGeometry>( "QgsGeometry" );
qRegisterMetaType<QgsInterval>( "QgsInterval" );
qRegisterMetaType<QgsRectangle>( "QgsRectangle" );
qRegisterMetaType<QgsPointXY>( "QgsPointXY" );
qRegisterMetaType<QgsPoint>( "QgsPoint" );
qRegisterMetaType<QgsDatumTransform::GridDetails>( "QgsDatumTransform::GridDetails" );
qRegisterMetaType<QgsDatumTransform::TransformDetails>( "QgsDatumTransform::TransformDetails" );
qRegisterMetaType<QgsNewsFeedParser::Entry>( "QgsNewsFeedParser::Entry" );
qRegisterMetaType<QgsRectangle>( "QgsRectangle" );
qRegisterMetaType<QgsLocatorResult>( "QgsLocatorResult" );
qRegisterMetaType<QgsGradientColorRamp>( "QgsGradientColorRamp" );
qRegisterMetaType<QgsProcessingModelChildParameterSource>( "QgsProcessingModelChildParameterSource" );
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// Qt6 documentation says these are not needed anymore (https://www.qt.io/blog/whats-new-in-qmetatype-qvariant) #spellok
// TODO: when tests can run against Qt6 builds, check for any regressions
qRegisterMetaTypeStreamOperators<QgsProcessingModelChildParameterSource>( "QgsProcessingModelChildParameterSource" );
#endif
qRegisterMetaType<QgsRemappingSinkDefinition>( "QgsRemappingSinkDefinition" );
qRegisterMetaType<QgsProcessingModelChildDependency>( "QgsProcessingModelChildDependency" );
qRegisterMetaType<QgsTextFormat>( "QgsTextFormat" );
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QMetaType::registerComparators<QgsProcessingModelChildDependency>();
QMetaType::registerEqualsComparator<QgsProcessingFeatureSourceDefinition>();
QMetaType::registerEqualsComparator<QgsProperty>();
QMetaType::registerEqualsComparator<QgsDateTimeRange>();
QMetaType::registerEqualsComparator<QgsDateRange>();
QMetaType::registerEqualsComparator<QgsUnsetAttributeValue>();
#endif
qRegisterMetaType<QPainter::CompositionMode>( "QPainter::CompositionMode" );
qRegisterMetaType<QgsDateTimeRange>( "QgsDateTimeRange" );
qRegisterMetaType<QgsDoubleRange>( "QgsDoubleRange" );
qRegisterMetaType<QgsIntRange>( "QgsIntRange" );
qRegisterMetaType<QList<QgsMapLayer *>>( "QList<QgsMapLayer*>" );
qRegisterMetaType<QMap<QNetworkRequest::Attribute, QVariant>>( "QMap<QNetworkRequest::Attribute,QVariant>" );
qRegisterMetaType<QMap<QNetworkRequest::KnownHeaders, QVariant>>( "QMap<QNetworkRequest::KnownHeaders,QVariant>" );
qRegisterMetaType<QList<QNetworkReply::RawHeaderPair>>( "QList<QNetworkReply::RawHeaderPair>" );
qRegisterMetaType< QAuthenticator * >( "QAuthenticator*" );
qRegisterMetaType< QgsGpsInformation >( "QgsGpsInformation" );
qRegisterMetaType< QgsSensorThingsExpansionDefinition >( "QgsSensorThingsExpansionDefinition" );
} );
std::call_once( sMetaTypesRegistered, registerMetaTypes );
( void ) resolvePkgPath();

View File

@ -124,10 +124,7 @@ void QgsMapLayerElevationProperties::setDataDefinedProperties( const QgsProperty
QgsPropertiesDefinition QgsMapLayerElevationProperties::propertyDefinitions()
{
static std::once_flag initialized;
std::call_once( initialized, [ = ]( )
{
initPropertyDefinitions();
} );
std::call_once( initialized, initPropertyDefinitions );
return sPropertyDefinitions;
}

View File

@ -454,9 +454,6 @@ void QgsRasterPipe::initPropertyDefinitions()
QgsPropertiesDefinition QgsRasterPipe::propertyDefinitions()
{
static std::once_flag initialized;
std::call_once( initialized, [ = ]( )
{
initPropertyDefinitions();
} );
std::call_once( initialized, initPropertyDefinitions );
return sPropertyDefinitions;
}