diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-11-04 20:31:58 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-11-05 13:26:36 +0100 |
commit | e07253e0262a11dc96a98598c55c43da16b9678a (patch) | |
tree | 5e803be171a4ec248ed5053258e3ea9d0a0f0e81 | |
parent | 212ea275f21251903e449ba5a6b7c4fc2dc57642 (diff) |
replace double-checked locking patterns with thread safe local statics
Change-Id: I4ed97cc6d9f733292156d71551d5ce3af6071445
Reviewed-on: https://gerrit.libreoffice.org/62858
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | connectivity/source/drivers/postgresql/pq_statics.cxx | 12 | ||||
-rw-r--r-- | oox/source/drawingml/presetgeometrynames.cxx | 30 | ||||
-rw-r--r-- | package/source/xstor/oseekinstream.cxx | 19 | ||||
-rw-r--r-- | svl/source/fsstor/oinputstreamcontainer.cxx | 39 |
4 files changed, 26 insertions, 74 deletions
diff --git a/connectivity/source/drivers/postgresql/pq_statics.cxx b/connectivity/source/drivers/postgresql/pq_statics.cxx index 0bec73919687..100c16c070f4 100644 --- a/connectivity/source/drivers/postgresql/pq_statics.cxx +++ b/connectivity/source/drivers/postgresql/pq_statics.cxx @@ -108,12 +108,7 @@ static cppu::IPropertyArrayHelper * createPropertyArrayHelper( Statics & getStatics() { - static Statics * p; - if( ! p ) - { - ::osl::MutexGuard guard( ::osl::Mutex::getGlobalMutex() ); - if( ! p ) - { + static Statics* p = []() { static Statics statics ; statics.SYSTEM_TABLE = "SYSTEM TABLE"; statics.TABLE = "TABLE"; @@ -665,9 +660,8 @@ Statics & getStatics() defTypeInfoMetaData[i].isAutoIncrement ) ); } - p = &statics; - } - } + return &statics; + }(); return *p; } diff --git a/oox/source/drawingml/presetgeometrynames.cxx b/oox/source/drawingml/presetgeometrynames.cxx index 4939cfcf0a3f..272094dd7ef6 100644 --- a/oox/source/drawingml/presetgeometrynames.cxx +++ b/oox/source/drawingml/presetgeometrynames.cxx @@ -20,13 +20,6 @@ namespace typedef std::unordered_map<const char*, const char*, rtl::CStringHash, rtl::CStringEqual> PresetGeometryHashMap; -static PresetGeometryHashMap* pHashMap = nullptr; -::osl::Mutex& getHashMapMutex() -{ - static osl::Mutex s_aHashMapProtection; - return s_aHashMapProtection; -} - struct PresetGeometryName { const char* pMsoName; @@ -79,27 +72,20 @@ static const PresetGeometryName pPresetGeometryNameArray[] OUString PresetGeometryTypeNames::GetFontworkType(const OUString& rMsoType) { - if (!pHashMap) - { // init hash map - ::osl::MutexGuard aGuard(getHashMapMutex()); - if (!pHashMap) - { - PresetGeometryHashMap* pH = new PresetGeometryHashMap; - const PresetGeometryName* pPtr = pPresetGeometryNameArray; - const PresetGeometryName* pEnd = pPtr + SAL_N_ELEMENTS(pPresetGeometryNameArray); - for (; pPtr < pEnd; pPtr++) - (*pH)[pPtr->pMsoName] = pPtr->pFontworkType; - pHashMap = pH; - } - } + static const PresetGeometryHashMap s_HashMap = []() { + PresetGeometryHashMap aH; + for (const auto& item : pPresetGeometryNameArray) + aH[item.pMsoName] = item.pFontworkType; + return aH; + }(); const char* pRetValue = ""; int i, nLen = rMsoType.getLength(); std::unique_ptr<char[]> pBuf(new char[nLen + 1]); for (i = 0; i < nLen; i++) pBuf[i] = static_cast<char>(rMsoType[i]); pBuf[i] = 0; - PresetGeometryHashMap::const_iterator aHashIter(pHashMap->find(pBuf.get())); - if (aHashIter != pHashMap->end()) + PresetGeometryHashMap::const_iterator aHashIter(s_HashMap.find(pBuf.get())); + if (aHashIter != s_HashMap.end()) pRetValue = (*aHashIter).second; return OUString(pRetValue, strlen(pRetValue), RTL_TEXTENCODING_ASCII_US); diff --git a/package/source/xstor/oseekinstream.cxx b/package/source/xstor/oseekinstream.cxx index 34d6a5d8f480..d19d6a745ab1 100644 --- a/package/source/xstor/oseekinstream.cxx +++ b/package/source/xstor/oseekinstream.cxx @@ -53,23 +53,10 @@ OInputSeekStream::~OInputSeekStream() uno::Sequence< uno::Type > SAL_CALL OInputSeekStream::getTypes() { - static ::cppu::OTypeCollection* pTypeCollection = nullptr ; + static cppu::OTypeCollection aTypeCollection(cppu::UnoType<io::XSeekable>::get(), + OInputCompStream::getTypes()); - if ( pTypeCollection == nullptr ) - { - ::osl::MutexGuard aGuard( m_xMutex->GetMutex() ) ; - - if ( pTypeCollection == nullptr ) - { - static ::cppu::OTypeCollection aTypeCollection( - cppu::UnoType<io::XSeekable>::get(), - OInputCompStream::getTypes() ); - - pTypeCollection = &aTypeCollection ; - } - } - - return pTypeCollection->getTypes() ; + return aTypeCollection.getTypes(); } uno::Any SAL_CALL OInputSeekStream::queryInterface( const uno::Type& rType ) diff --git a/svl/source/fsstor/oinputstreamcontainer.cxx b/svl/source/fsstor/oinputstreamcontainer.cxx index 9b9899992119..b62aca14c9b2 100644 --- a/svl/source/fsstor/oinputstreamcontainer.cxx +++ b/svl/source/fsstor/oinputstreamcontainer.cxx @@ -39,36 +39,21 @@ OFSInputStreamContainer::~OFSInputStreamContainer() uno::Sequence< uno::Type > SAL_CALL OFSInputStreamContainer::getTypes() { - static ::cppu::OTypeCollection* pTypeCollection = nullptr ; - - if ( pTypeCollection == nullptr ) + if (m_bSeekable) { - ::osl::MutexGuard aGuard( m_aMutex ) ; - - if ( pTypeCollection == nullptr ) - { - if ( m_bSeekable ) - { - static ::cppu::OTypeCollection aTypeCollection( - cppu::UnoType<io::XStream>::get(), - cppu::UnoType<io::XInputStream>::get(), - cppu::UnoType<io::XSeekable>::get()); - - pTypeCollection = &aTypeCollection ; - } - else - { - static ::cppu::OTypeCollection aTypeCollection( - cppu::UnoType<io::XStream>::get(), - cppu::UnoType<io::XInputStream>::get()); - - pTypeCollection = &aTypeCollection ; - } - } - } + static cppu::OTypeCollection aTypeCollection(cppu::UnoType<io::XStream>::get(), + cppu::UnoType<io::XInputStream>::get(), + cppu::UnoType<io::XSeekable>::get()); - return pTypeCollection->getTypes() ; + return aTypeCollection.getTypes(); + } + else + { + static cppu::OTypeCollection aTypeCollection(cppu::UnoType<io::XStream>::get(), + cppu::UnoType<io::XInputStream>::get()); + return aTypeCollection.getTypes(); + } } uno::Any SAL_CALL OFSInputStreamContainer::queryInterface( const uno::Type& rType ) |