From 3dcc288468eb2a71ba1381412dd7e25b9fb329d9 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Wed, 17 Jul 2024 13:15:51 +0100 Subject: cid#1555824 Check of thread-shared field evades lock acquisition Change-Id: Ic0e8e87138ca86a1618e110516f3d8cef481dec7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170626 Tested-by: Jenkins Reviewed-by: Michael Stahl --- sdext/source/minimizer/pppoptimizertoken.cxx | 31 ++++++++++------------------ 1 file changed, 11 insertions(+), 20 deletions(-) (limited to 'sdext/source/minimizer') diff --git a/sdext/source/minimizer/pppoptimizertoken.cxx b/sdext/source/minimizer/pppoptimizertoken.cxx index 472992551b81..73d1280c3a29 100644 --- a/sdext/source/minimizer/pppoptimizertoken.cxx +++ b/sdext/source/minimizer/pppoptimizertoken.cxx @@ -23,15 +23,8 @@ #include #include #include -#include typedef std::unordered_map< const char*, PPPOptimizerTokenEnum, rtl::CStringHash, rtl::CStringEqual> TypeNameHashMap; -static TypeNameHashMap* pHashMap = nullptr; -static std::mutex& getHashMapMutex() -{ - static std::mutex s_aHashMapProtection; - return s_aHashMapProtection; -} namespace { @@ -110,21 +103,19 @@ const TokenTable pTokenTableArray[] = { "NotFound", TK_NotFound } }; +static TypeNameHashMap* createHashMap() +{ + TypeNameHashMap* pH = new TypeNameHashMap; + const TokenTable* pPtr = pTokenTableArray; + const TokenTable* pEnd = pPtr + SAL_N_ELEMENTS( pTokenTableArray ); + for ( ; pPtr < pEnd; pPtr++ ) + (*pH)[ pPtr->pS ] = pPtr->pE; + return pH; +} + PPPOptimizerTokenEnum TKGet( std::u16string_view rToken ) { - if ( !pHashMap ) - { // init hash map - std::scoped_lock aGuard( getHashMapMutex() ); - if ( !pHashMap ) - { - TypeNameHashMap* pH = new TypeNameHashMap; - const TokenTable* pPtr = pTokenTableArray; - const TokenTable* pEnd = pPtr + SAL_N_ELEMENTS( pTokenTableArray ); - for ( ; pPtr < pEnd; pPtr++ ) - (*pH)[ pPtr->pS ] = pPtr->pE; - pHashMap = pH; - } - } + static TypeNameHashMap* pHashMap = createHashMap(); PPPOptimizerTokenEnum eRetValue = TK_NotFound; size_t i, nLen = rToken.size(); std::unique_ptr pBuf(new char[ nLen + 1 ]); -- cgit