diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2018-06-13 17:58:26 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2018-06-19 16:49:50 +0200 |
commit | 3020fb15fe2e7f5f857425975879da402b813691 (patch) | |
tree | d30d9c7d7edcbc4e376b7a32523c95d55ae0b889 /sc | |
parent | e559d360d0a19715bd6261b7dfc7f03eb7c9b99e (diff) |
move doubleCheckedInit() to a comphelper header file
For further reuse in more source files.
Change-Id: I2fcbb98a81725e14d6d433f62622d2c48d146de1
Reviewed-on: https://gerrit.libreoffice.org/55763
Tested-by: Jenkins
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/data/global.cxx | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx index 5f5fe519c2c6..75326696257c 100644 --- a/sc/source/core/data/global.cxx +++ b/sc/source/core/data/global.cxx @@ -47,6 +47,7 @@ #include <i18nlangtag/mslangid.hxx> #include <com/sun/star/lang/Locale.hpp> +#include <comphelper/doublecheckedinit.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/string.hxx> #include <unotools/calendarwrapper.hxx> @@ -126,28 +127,6 @@ sal_uInt16 nScFillModeMouseModifier = 0; //FIXME: And this bool ScGlobal::bThreadedGroupCalcInProgress = false; -// Thread-safe singleton creation. Ideally rtl_Instance should be used, but that one doesn't -// allow accessing the pointer (so ScGlobal::Clear() cannot free the objects). So this function -// is basically rtl_Instance::create() that uses a given pointer. -template< typename Type, typename Function = std::function< Type*() >, - typename Guard = osl::MutexGuard, typename GuardCtor = osl::GetGlobalMutex > -static inline -Type* doubleCheckedInit( std::atomic<Type*>& pointer, Function function, GuardCtor guardCtor = osl::GetGlobalMutex()) -{ - Type* p = pointer.load( std::memory_order_acquire ); - if (!p) - { - Guard guard(guardCtor()); - p = pointer.load( std::memory_order_relaxed ); - if (!p) - { - p = function(); - pointer.store( p, std::memory_order_release ); - } - } - return p; -} - // Static functions bool ScGlobal::HasAttrChanged( const SfxItemSet& rNewAttrs, @@ -299,12 +278,12 @@ ScAutoFormat* ScGlobal::GetOrCreateAutoFormat() LegacyFuncCollection* ScGlobal::GetLegacyFuncCollection() { - return doubleCheckedInit( pLegacyFuncCollection, []() { return new LegacyFuncCollection(); }); + return comphelper::doubleCheckedInit( pLegacyFuncCollection, []() { return new LegacyFuncCollection(); }); } ScUnoAddInCollection* ScGlobal::GetAddInCollection() { - return doubleCheckedInit( pAddInCollection, []() { return new ScUnoAddInCollection(); }); + return comphelper::doubleCheckedInit( pAddInCollection, []() { return new ScUnoAddInCollection(); }); } ScUserList* ScGlobal::GetUserList() @@ -999,7 +978,7 @@ void ScGlobal::AddLanguage( SfxItemSet& rSet, const SvNumberFormatter& rFormatte utl::TransliterationWrapper* ScGlobal::GetpTransliteration() { - return doubleCheckedInit( pTransliteration, + return comphelper::doubleCheckedInit( pTransliteration, []() { const LanguageType eOfficeLanguage = Application::GetSettings().GetLanguageTag().getLanguageType(); @@ -1011,7 +990,7 @@ utl::TransliterationWrapper* ScGlobal::GetpTransliteration() } ::utl::TransliterationWrapper* ScGlobal::GetCaseTransliteration() { - return doubleCheckedInit( pCaseTransliteration, + return comphelper::doubleCheckedInit( pCaseTransliteration, []() { const LanguageType eOfficeLanguage = Application::GetSettings().GetLanguageTag().getLanguageType(); @@ -1041,7 +1020,7 @@ CalendarWrapper* ScGlobal::GetCalendar() } CollatorWrapper* ScGlobal::GetCollator() { - return doubleCheckedInit( pCollator, + return comphelper::doubleCheckedInit( pCollator, []() { CollatorWrapper* p = new CollatorWrapper( ::comphelper::getProcessComponentContext() ); @@ -1051,7 +1030,7 @@ CollatorWrapper* ScGlobal::GetCollator() } CollatorWrapper* ScGlobal::GetCaseCollator() { - return doubleCheckedInit( pCaseCollator, + return comphelper::doubleCheckedInit( pCaseCollator, []() { CollatorWrapper* p = new CollatorWrapper( ::comphelper::getProcessComponentContext() ); @@ -1061,7 +1040,7 @@ CollatorWrapper* ScGlobal::GetCaseCollator() } css::lang::Locale* ScGlobal::GetLocale() { - return doubleCheckedInit( pLocale, + return comphelper::doubleCheckedInit( pLocale, []() { return new css::lang::Locale( Application::GetSettings().GetLanguageTag().getLocale()); }); } |