scripting/source/stringresource/stringresource.cxx | 102 ++++++++++----------- scripting/source/stringresource/stringresource.hxx | 28 +++-- 2 files changed, 65 insertions(+), 65 deletions(-)
New commits: commit 21edde763dfc0c511421993ca6168730232f9f8e Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Wed Nov 6 08:57:26 2024 +0000 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Fri Nov 8 13:28:00 2024 +0100 Related: cid#1608068 Data race condition Change-Id: I10c6dd9c12c7558d1d71f39580b3fa470efe69e0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176262 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/scripting/source/stringresource/stringresource.cxx b/scripting/source/stringresource/stringresource.cxx index 53802f356cd1..1e548d6ae3bc 100644 --- a/scripting/source/stringresource/stringresource.cxx +++ b/scripting/source/stringresource/stringresource.cxx @@ -123,11 +123,11 @@ void StringResourceImpl::removeModifyListener( const Reference< XModifyListener // XStringResourceResolver OUString StringResourceImpl::implResolveString - ( const OUString& ResourceID, LocaleItem* pLocaleItem ) + (std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, LocaleItem* pLocaleItem) { OUString aRetStr; bool bSuccess = false; - if( pLocaleItem != nullptr && loadLocale( pLocaleItem ) ) + if( pLocaleItem != nullptr && loadLocale(rGuard, pLocaleItem) ) { IdToStringMap::iterator it = pLocaleItem->m_aIdToStringMap.find( ResourceID ); if( it != pLocaleItem->m_aIdToStringMap.end() ) @@ -146,20 +146,20 @@ OUString StringResourceImpl::implResolveString OUString StringResourceImpl::resolveString( const OUString& ResourceID ) { std::unique_lock aGuard( m_aMutex ); - return implResolveString( ResourceID, m_pCurrentLocaleItem ); + return implResolveString(aGuard, ResourceID, m_pCurrentLocaleItem); } OUString StringResourceImpl::resolveStringForLocale( const OUString& ResourceID, const Locale& locale ) { std::unique_lock aGuard( m_aMutex ); LocaleItem* pLocaleItem = getItemForLocale( locale, false ); - return implResolveString( ResourceID, pLocaleItem ); + return implResolveString(aGuard, ResourceID, pLocaleItem); } -bool StringResourceImpl::implHasEntryForId( const OUString& ResourceID, LocaleItem* pLocaleItem ) +bool StringResourceImpl::implHasEntryForId(std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, LocaleItem* pLocaleItem) { bool bSuccess = false; - if( pLocaleItem != nullptr && loadLocale( pLocaleItem ) ) + if( pLocaleItem != nullptr && loadLocale(rGuard, pLocaleItem ) ) { IdToStringMap::iterator it = pLocaleItem->m_aIdToStringMap.find( ResourceID ); if( it != pLocaleItem->m_aIdToStringMap.end() ) @@ -171,7 +171,7 @@ bool StringResourceImpl::implHasEntryForId( const OUString& ResourceID, LocaleIt sal_Bool StringResourceImpl::hasEntryForId( const OUString& ResourceID ) { std::unique_lock aGuard( m_aMutex ); - return implHasEntryForId( ResourceID, m_pCurrentLocaleItem ); + return implHasEntryForId(aGuard, ResourceID, m_pCurrentLocaleItem); } sal_Bool StringResourceImpl::hasEntryForIdAndLocale( const OUString& ResourceID, @@ -179,13 +179,13 @@ sal_Bool StringResourceImpl::hasEntryForIdAndLocale( const OUString& ResourceID, { std::unique_lock aGuard( m_aMutex ); LocaleItem* pLocaleItem = getItemForLocale( locale, false ); - return implHasEntryForId( ResourceID, pLocaleItem ); + return implHasEntryForId(aGuard, ResourceID, pLocaleItem); } -Sequence< OUString > StringResourceImpl::implGetResourceIDs( LocaleItem* pLocaleItem ) +Sequence< OUString > StringResourceImpl::implGetResourceIDs(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) { Sequence< OUString > aIDSeq( 0 ); - if( pLocaleItem && loadLocale( pLocaleItem ) ) + if( pLocaleItem && loadLocale(rGuard, pLocaleItem) ) { const IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap; sal_Int32 nResourceIDCount = rHashMap.size(); @@ -207,13 +207,13 @@ Sequence< OUString > StringResourceImpl::getResourceIDsForLocale { std::unique_lock aGuard( m_aMutex ); LocaleItem* pLocaleItem = getItemForLocale( locale, false ); - return implGetResourceIDs( pLocaleItem ); + return implGetResourceIDs(aGuard, pLocaleItem); } Sequence< OUString > StringResourceImpl::getResourceIDs( ) { std::unique_lock aGuard( m_aMutex ); - return implGetResourceIDs( m_pCurrentLocaleItem ); + return implGetResourceIDs(aGuard, m_pCurrentLocaleItem); } Locale StringResourceImpl::getCurrentLocale() @@ -283,7 +283,7 @@ void StringResourceImpl::implSetCurrentLocale( std::unique_lock<std::mutex>& rGu if( pLocaleItem != nullptr ) { - (void)loadLocale( pLocaleItem ); + (void)loadLocale(rGuard, pLocaleItem); m_pCurrentLocaleItem = pLocaleItem; // Only notify without modifying @@ -320,7 +320,7 @@ void StringResourceImpl::setDefaultLocale( const Locale& locale ) void StringResourceImpl::implSetString( std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, const OUString& Str, LocaleItem* pLocaleItem ) { - if( !(pLocaleItem != nullptr && loadLocale( pLocaleItem )) ) + if( !(pLocaleItem != nullptr && loadLocale(rGuard, pLocaleItem)) ) return; IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap; @@ -331,7 +331,7 @@ void StringResourceImpl::implSetString( std::unique_lock<std::mutex>& rGuard, co { IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap; rIndexMap[ ResourceID ] = pLocaleItem->m_nNextIndex++; - implScanIdForNumber( ResourceID ); + implScanIdForNumber(rGuard, ResourceID); } rHashMap[ ResourceID ] = Str; pLocaleItem->m_bModified = true; @@ -356,7 +356,7 @@ void StringResourceImpl::setStringForLocale void StringResourceImpl::implRemoveId( std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, LocaleItem* pLocaleItem ) { - if( pLocaleItem != nullptr && loadLocale( pLocaleItem ) ) + if( pLocaleItem != nullptr && loadLocale(rGuard, pLocaleItem) ) { IdToStringMap& rHashMap = pLocaleItem->m_aIdToStringMap; IdToStringMap::iterator it = rHashMap.find( ResourceID ); @@ -410,7 +410,7 @@ void StringResourceImpl::newLocale( const Locale& locale ) LocaleItem* pCopyFromItem = m_pDefaultLocaleItem; if( pCopyFromItem == nullptr ) pCopyFromItem = m_pCurrentLocaleItem; - if( pCopyFromItem != nullptr && loadLocale( pCopyFromItem ) ) + if( pCopyFromItem != nullptr && loadLocale(aGuard, pCopyFromItem) ) { const IdToStringMap& rSourceMap = pCopyFromItem->m_aIdToStringMap; IdToStringMap& rTargetMap = pLocaleItem->m_aIdToStringMap; @@ -506,7 +506,7 @@ void StringResourceImpl::removeLocale( const Locale& locale ) implModified(aGuard); } -void StringResourceImpl::implScanIdForNumber( const OUString& ResourceID ) +void StringResourceImpl::implScanIdForNumber(std::unique_lock<std::mutex>& /*rGuard*/, const OUString& ResourceID) { const sal_Unicode* pSrc = ResourceID.getStr(); sal_Int32 nLen = ResourceID.getLength(); @@ -534,7 +534,7 @@ sal_Int32 StringResourceImpl::getUniqueNumericId( ) if( m_nNextUniqueNumericId == UNIQUE_NUMBER_NEEDS_INITIALISATION ) { - implLoadAllLocales(); + implLoadAllLocales(aGuard); m_nNextUniqueNumericId = 0; } @@ -614,38 +614,32 @@ void StringResourceImpl::implNotifyListeners(std::unique_lock<std::mutex>& rGuar ); } - // Loading -bool StringResourceImpl::loadLocale( LocaleItem* ) +bool StringResourceImpl::loadLocale(std::unique_lock<std::mutex>& /*rGuard*/, LocaleItem*) { // Base implementation has nothing to load return true; } -void StringResourceImpl::implLoadAllLocales() +void StringResourceImpl::implLoadAllLocales(std::unique_lock<std::mutex>& /*rGuard*/) { // Base implementation has nothing to load } - // StringResourcePersistenceImpl - StringResourcePersistenceImpl::StringResourcePersistenceImpl( const Reference< XComponentContext >& rxContext ) : StringResourcePersistenceImpl_BASE( rxContext ) { } - StringResourcePersistenceImpl::~StringResourcePersistenceImpl() { } - // XServiceInfo - OUString StringResourcePersistenceImpl::getImplementationName( ) { return u"com.sun.star.comp.scripting.StringResource"_ustr; @@ -824,11 +818,12 @@ void StringResourcePersistenceImpl::storeToStorage( const Reference< XStorage >& { std::unique_lock aGuard( m_aMutex ); - implStoreAtStorage( NameBase, Comment, Storage, false/*bUsedForStore*/, true/*bStoreAll*/ ); + implStoreAtStorage(aGuard, NameBase, Comment, Storage, false/*bUsedForStore*/, true/*bStoreAll*/ ); } void StringResourcePersistenceImpl::implStoreAtStorage ( + std::unique_lock<std::mutex>& rGuard, const OUString& aNameBase, const OUString& aComment, const Reference< css::embed::XStorage >& Storage, @@ -861,7 +856,7 @@ void StringResourcePersistenceImpl::implStoreAtStorage for( auto& pLocaleItem : m_aLocaleItemVector ) { if( pLocaleItem != nullptr && (bStoreAll || pLocaleItem->m_bModified) && - loadLocale( pLocaleItem.get() ) ) + loadLocale(rGuard, pLocaleItem.get()) ) { OUString aStreamName = implGetFileNameForLocaleItem( pLocaleItem.get(), aNameBase ) + ".properties"; @@ -935,7 +930,7 @@ void StringResourcePersistenceImpl::storeToURL( const OUString& URL, if( Handler.is() ) xFileAccess->setInteractionHandler( Handler ); - implStoreAtLocation( URL, NameBase, Comment, xFileAccess, false/*bUsedForStore*/, true/*bStoreAll*/ ); + implStoreAtLocation(aGuard, URL, NameBase, Comment, xFileAccess, false/*bUsedForStore*/, true/*bStoreAll*/); } void StringResourcePersistenceImpl::implKillRemovedLocaleFiles @@ -982,6 +977,7 @@ void StringResourcePersistenceImpl::implKillChangedDefaultFiles void StringResourcePersistenceImpl::implStoreAtLocation ( + std::unique_lock<std::mutex>& rGuard, std::u16string_view Location, const OUString& aNameBase, const OUString& aComment, @@ -998,7 +994,7 @@ void StringResourcePersistenceImpl::implStoreAtLocation for( auto& pLocaleItem : m_aLocaleItemVector ) { if( pLocaleItem != nullptr && (bStoreAll || bKillAll || pLocaleItem->m_bModified) && - loadLocale( pLocaleItem.get() ) ) + loadLocale(rGuard, pLocaleItem.get()) ) { OUString aCompleteFileName = implGetPathForLocaleItem( pLocaleItem.get(), aNameBase, Location ); @@ -1178,7 +1174,7 @@ Sequence< sal_Int8 > StringResourcePersistenceImpl::exportBinary( ) sal_Int32 iDefault = 0; for( auto& pLocaleItem : m_aLocaleItemVector ) { - if( pLocaleItem != nullptr && loadLocale( pLocaleItem.get() ) ) + if( pLocaleItem != nullptr && loadLocale(aGuard, pLocaleItem.get()) ) { if( m_pDefaultLocaleItem == pLocaleItem.get() ) iDefault = iLocale; @@ -1414,8 +1410,9 @@ void StringResourcePersistenceImpl::importBinary( const Sequence< ::sal_Int8 >& LocaleItem* pLocaleItem = new LocaleItem( std::move(aLocale) ); if( iDefault == i ) pUseAsDefaultItem = pLocaleItem; + std::unique_lock aGuard( m_aMutex ); m_aLocaleItemVector.emplace_back( pLocaleItem ); - implReadPropertiesFile( pLocaleItem, xInput ); + implReadPropertiesFile(aGuard, pLocaleItem, xInput); } } @@ -1467,11 +1464,11 @@ static bool checkNamingSceme( std::u16string_view aName, std::u16string_view aNa return bSuccess; } -void StringResourcePersistenceImpl::implLoadAllLocales() +void StringResourcePersistenceImpl::implLoadAllLocales(std::unique_lock<std::mutex>& rGuard) { for( auto& pLocaleItem : m_aLocaleItemVector ) if( pLocaleItem ) - loadLocale( pLocaleItem.get() ); + loadLocale(rGuard, pLocaleItem.get()); } // Scan locale properties files helper @@ -1537,7 +1534,7 @@ void StringResourcePersistenceImpl::implScanLocales(std::unique_lock<std::mutex> // base class, but pure virtual not possible- } -bool StringResourcePersistenceImpl::loadLocale( LocaleItem* pLocaleItem ) +bool StringResourcePersistenceImpl::loadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) { bool bSuccess = false; @@ -1550,14 +1547,14 @@ bool StringResourcePersistenceImpl::loadLocale( LocaleItem* pLocaleItem ) } else { - bSuccess = implLoadLocale( pLocaleItem ); + bSuccess = implLoadLocale(rGuard, pLocaleItem); pLocaleItem->m_bLoaded = true; // = bSuccess??? -> leads to more tries } } return bSuccess; } -bool StringResourcePersistenceImpl::implLoadLocale( LocaleItem* ) +bool StringResourcePersistenceImpl::implLoadLocale(std::unique_lock<std::mutex>& /*rGuard*/, LocaleItem*) { // Dummy implementation, method not called for this // base class, but pure virtual not possible- @@ -1729,8 +1726,9 @@ static void CheckContinueInNextLine( const Reference< io::XTextInputStream2 >& x } } -bool StringResourcePersistenceImpl::implReadPropertiesFile - ( LocaleItem* pLocaleItem, const Reference< io::XInputStream >& xInputStream ) +bool StringResourcePersistenceImpl::implReadPropertiesFile( + std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem, + const Reference<io::XInputStream>& xInputStream) { if( !xInputStream.is() || pLocaleItem == nullptr ) return false; @@ -1842,7 +1840,7 @@ bool StringResourcePersistenceImpl::implReadPropertiesFile // Push into table pLocaleItem->m_aIdToStringMap[ aResourceID ] = aValueStr; - implScanIdForNumber( aResourceID ); + implScanIdForNumber(rGuard, aResourceID); IdToIndexMap& rIndexMap = pLocaleItem->m_aIdToIndexMap; rIndexMap[ aResourceID ] = pLocaleItem->m_nNextIndex++; } @@ -2172,7 +2170,7 @@ void StringResourceWithStorageImpl::store() if( !m_bModified && !bStoreAll ) return; - implStoreAtStorage( m_aNameBase, m_aComment, m_xStorage, true/*bUsedForStore*/, bStoreAll ); + implStoreAtStorage(aGuard, m_aNameBase, m_aComment, m_xStorage, true/*bUsedForStore*/, bStoreAll); m_bModified = false; } @@ -2222,7 +2220,7 @@ void StringResourceWithStorageImpl::setStorage( const Reference< XStorage >& Sto throw IllegalArgumentException( u"StringResourceWithStorageImpl::setStorage: invalid storage"_ustr, Reference< XInterface >(), 0 ); } - implLoadAllLocales(); + implLoadAllLocales(aGuard); m_xStorage = Storage; m_bStorageChanged = true; @@ -2233,7 +2231,7 @@ void StringResourceWithStorageImpl::setStorage( const Reference< XStorage >& Sto // Scan locale properties files -void StringResourceWithStorageImpl::implScanLocales(std::unique_lock<std::mutex>& /*rGuard*/) +void StringResourceWithStorageImpl::implScanLocales(std::unique_lock<std::mutex>& rGuard) { if( m_xStorage.is() ) { @@ -2241,11 +2239,11 @@ void StringResourceWithStorageImpl::implScanLocales(std::unique_lock<std::mutex> implScanLocaleNames( aContentSeq ); } - implLoadAllLocales(); + implLoadAllLocales(rGuard); } // Loading -bool StringResourceWithStorageImpl::implLoadLocale( LocaleItem* pLocaleItem ) +bool StringResourceWithStorageImpl::implLoadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) { bool bSuccess = false; try @@ -2260,7 +2258,7 @@ bool StringResourceWithStorageImpl::implLoadLocale( LocaleItem* pLocaleItem ) Reference< io::XInputStream > xInputStream = xElementStream->getInputStream(); if( xInputStream.is() ) { - bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile( pLocaleItem, xInputStream ); + bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile(rGuard, pLocaleItem, xInputStream); xInputStream->closeInput(); } } @@ -2463,7 +2461,7 @@ void StringResourceWithLocationImpl::store() return; Reference< ucb::XSimpleFileAccess3 > xFileAccess = getFileAccessImpl(); - implStoreAtLocation( m_aLocation, m_aNameBase, m_aComment, + implStoreAtLocation(aGuard, m_aLocation, m_aNameBase, m_aComment, xFileAccess, true/*bUsedForStore*/, bStoreAll ); m_bModified = false; } @@ -2517,10 +2515,10 @@ void StringResourceWithLocationImpl::setURL( const OUString& URL ) throw IllegalArgumentException( u"StringResourceWithLocationImpl::setURL: invalid URL"_ustr, Reference< XInterface >(), 0 ); } - implLoadAllLocales(); + implLoadAllLocales(aGuard); // Delete files at old location - implStoreAtLocation( m_aLocation, m_aNameBase, m_aComment, + implStoreAtLocation(aGuard, m_aLocation, m_aNameBase, m_aComment, getFileAccessImpl(), false/*bUsedForStore*/, false/*bStoreAll*/, true/*bKillAll*/ ); m_aLocation = URL; @@ -2543,7 +2541,7 @@ void StringResourceWithLocationImpl::implScanLocales(std::unique_lock<std::mutex } // Loading -bool StringResourceWithLocationImpl::implLoadLocale( LocaleItem* pLocaleItem ) +bool StringResourceWithLocationImpl::implLoadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) { bool bSuccess = false; @@ -2560,7 +2558,7 @@ bool StringResourceWithLocationImpl::implLoadLocale( LocaleItem* pLocaleItem ) {} if( xInputStream.is() ) { - bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile( pLocaleItem, xInputStream ); + bSuccess = StringResourcePersistenceImpl::implReadPropertiesFile(rGuard, pLocaleItem, xInputStream); xInputStream->closeInput(); } diff --git a/scripting/source/stringresource/stringresource.hxx b/scripting/source/stringresource/stringresource.hxx index d03e1d7bde06..75c3ed239729 100644 --- a/scripting/source/stringresource/stringresource.hxx +++ b/scripting/source/stringresource/stringresource.hxx @@ -101,7 +101,7 @@ protected: sal_Int32 m_nNextUniqueNumericId; // Scans ResourceID to start with number and adapt m_nNextUniqueNumericId - void implScanIdForNumber( const OUString& ResourceID ); + void implScanIdForNumber(std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID); const static sal_Int32 UNIQUE_NUMBER_NEEDS_INITIALISATION = -1; // Checks read only status and throws exception if it's true @@ -126,9 +126,9 @@ protected: //=== Impl methods for ...ForLocale methods === /// @throws css::resource::MissingResourceException - OUString implResolveString( const OUString& ResourceID, LocaleItem* pLocaleItem ); - bool implHasEntryForId( const OUString& ResourceID, LocaleItem* pLocaleItem ); - css::uno::Sequence< OUString > implGetResourceIDs( LocaleItem* pLocaleItem ); + OUString implResolveString(std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, LocaleItem* pLocaleItem); + bool implHasEntryForId(std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, LocaleItem* pLocaleItem); + css::uno::Sequence< OUString > implGetResourceIDs(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem); void implSetString( std::unique_lock<std::mutex>& rGuard, const OUString& ResourceID, const OUString& Str, LocaleItem* pLocaleItem ); /// @throws css::resource::MissingResourceException @@ -136,9 +136,9 @@ protected: // Method to load a locale if necessary, returns true if loading was // successful. Default implementation in base class just returns true. - virtual bool loadLocale( LocaleItem* pLocaleItem ); + virtual bool loadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem); - virtual void implLoadAllLocales(); + virtual void implLoadAllLocales(std::unique_lock<std::mutex>& rGuard); public: explicit StringResourceImpl( @@ -203,20 +203,20 @@ protected: virtual void implScanLocales(std::unique_lock<std::mutex>& rGuard); // Method to load a locale if necessary, returns true if loading was successful - virtual bool loadLocale( LocaleItem* pLocaleItem ) override; + virtual bool loadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) override; // does the actual loading - virtual bool implLoadLocale( LocaleItem* pLocaleItem ); + virtual bool implLoadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem); - virtual void implLoadAllLocales() override; + virtual void implLoadAllLocales(std::unique_lock<std::mutex>& rGuard) override; void implScanLocaleNames( const css::uno::Sequence< OUString >& aContentSeq ); static OUString implGetFileNameForLocaleItem( LocaleItem const * pLocaleItem, const OUString& aNameBase ); static OUString implGetPathForLocaleItem( LocaleItem const * pLocaleItem, const OUString& aNameBase, std::u16string_view aLocation, bool bDefaultFile=false ); - bool implReadPropertiesFile( LocaleItem* pLocaleItem, - const css::uno::Reference< css::io::XInputStream >& xInput ); + bool implReadPropertiesFile(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem, + const css::uno::Reference< css::io::XInputStream >& xInput); bool implWritePropertiesFile( LocaleItem const * pLocaleItem, const css::uno::Reference< css::io::XOutputStream >& xOutputStream, @@ -228,6 +228,7 @@ protected: /// @throws css::uno::RuntimeException void implStoreAtStorage ( + std::unique_lock<std::mutex>& rGuard, const OUString& aNameBase, const OUString& aComment, const css::uno::Reference< css::embed::XStorage >& Storage, @@ -257,6 +258,7 @@ protected: /// @throws css::uno::RuntimeException void implStoreAtLocation ( + std::unique_lock<std::mutex>& rGuard, std::u16string_view Location, const OUString& aNameBase, const OUString& aComment, @@ -334,7 +336,7 @@ class StringResourceWithStorageImpl : public StringResourceWithStorageImpl_BASE bool m_bStorageChanged; virtual void implScanLocales(std::unique_lock<std::mutex>& rGuard) override; - virtual bool implLoadLocale( LocaleItem* pLocaleItem ) override; + virtual bool implLoadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) override; public: explicit StringResourceWithStorageImpl( const css::uno::Reference< css::uno::XComponentContext >& rxContext ); @@ -416,7 +418,7 @@ class StringResourceWithLocationImpl : public StringResourceWithLocationImpl_BAS const css::uno::Reference< css::ucb::XSimpleFileAccess3 > & getFileAccessImpl(); virtual void implScanLocales(std::unique_lock<std::mutex>& rGuard) override; - virtual bool implLoadLocale( LocaleItem* pLocaleItem ) override; + virtual bool implLoadLocale(std::unique_lock<std::mutex>& rGuard, LocaleItem* pLocaleItem) override; public: explicit StringResourceWithLocationImpl( const css::uno::Reference< css::uno::XComponentContext >& rxContext );