From f698ddfeffda7391965b7bb8b488420332ac37bf Mon Sep 17 00:00:00 2001 From: Xisco Fauli Date: Wed, 15 Jun 2016 20:41:11 +0200 Subject: tdf#89329: use shared_ptr for pImpl in miscopt Change-Id: I7c60116d4f14e1451e7b96568104baada01dfaca Reviewed-on: https://gerrit.libreoffice.org/26330 Tested-by: Jenkins Reviewed-by: Noel Grandin --- include/svtools/miscopt.hxx | 24 +---------- svtools/source/config/miscopt.cxx | 86 +++++++++++++++------------------------ 2 files changed, 34 insertions(+), 76 deletions(-) diff --git a/include/svtools/miscopt.hxx b/include/svtools/miscopt.hxx index 31b745fb92f3..80835a9058e7 100644 --- a/include/svtools/miscopt.hxx +++ b/include/svtools/miscopt.hxx @@ -25,6 +25,7 @@ #include #include #include +#include /*-************************************************************************************************************ @short forward declaration to our private date container implementation @@ -45,17 +46,6 @@ class SvtMiscOptions_Impl; class SVT_DLLPUBLIC SvtMiscOptions: public utl::detail::Options { public: - /*-**************************************************************************************************** - @short standard constructor and destructor - @descr This will initialize an instance with default values. - We implement these class with a refcount mechanism! Every instance of this class increase it - at create and decrease it at delete time - but all instances use the same data container! - He is implemented as a static member ... - - @seealso member m_nRefCount - @seealso member m_pDataContainer - *//*-*****************************************************************************************************/ - SvtMiscOptions(); virtual ~SvtMiscOptions(); @@ -108,17 +98,7 @@ class SVT_DLLPUBLIC SvtMiscOptions: public utl::detail::Options SVT_DLLPRIVATE static ::osl::Mutex& GetInitMutex(); private: - - /*Attention - - Don't initialize these static members in these headers! - a) Double defined symbols will be detected ... - b) and unresolved externals exist at linking time. - Do it in your source only. - */ - - static SvtMiscOptions_Impl* m_pDataContainer ; - static sal_Int32 m_nRefCount ; + std::shared_ptr m_pImpl; }; // class SvtMiscOptions diff --git a/svtools/source/config/miscopt.cxx b/svtools/source/config/miscopt.cxx index 1210883049d5..e0ecfd82f1b4 100644 --- a/svtools/source/config/miscopt.cxx +++ b/svtools/source/config/miscopt.cxx @@ -643,85 +643,63 @@ Sequence< OUString > SvtMiscOptions_Impl::GetPropertyNames() return seqPropertyNames; } - -// initialize static member -// DON'T DO IT IN YOUR HEADER! -// see definition for further information - -SvtMiscOptions_Impl* SvtMiscOptions::m_pDataContainer = nullptr ; -sal_Int32 SvtMiscOptions::m_nRefCount = 0 ; - - -// constructor +std::weak_ptr m_pMiscOptions; SvtMiscOptions::SvtMiscOptions() { - // SvtMiscOptions_Impl ctor indirectly calls code that requires locked - // SolarMutex; lock it first: - SolarMutexGuard g; // Global access, must be guarded (multithreading!). MutexGuard aGuard( GetInitMutex() ); - // Increase our refcount ... - ++m_nRefCount; - // ... and initialize our data container only if it not already exist! - if( m_pDataContainer == nullptr ) + + m_pImpl = m_pMiscOptions.lock(); + if( !m_pImpl ) { - m_pDataContainer = new SvtMiscOptions_Impl; - svtools::ItemHolder2::holdConfigItem(E_MISCOPTIONS); + m_pImpl = std::make_shared(); + m_pMiscOptions = m_pImpl; + svtools::ItemHolder2::holdConfigItem(E_MISCOPTIONS); } } - -// destructor - SvtMiscOptions::~SvtMiscOptions() { // Global access, must be guarded (multithreading!) MutexGuard aGuard( GetInitMutex() ); - // Decrease our refcount. - --m_nRefCount; - // If last instance was deleted ... - // we must destroy our static data container! - if( m_nRefCount <= 0 ) - { - delete m_pDataContainer; - m_pDataContainer = nullptr; - } + + m_pImpl.reset(); } bool SvtMiscOptions::UseSystemFileDialog() const { - return m_pDataContainer->UseSystemFileDialog(); + return m_pImpl->UseSystemFileDialog(); } void SvtMiscOptions::SetUseSystemFileDialog( bool bEnable ) { - m_pDataContainer->SetUseSystemFileDialog( bEnable ); + m_pImpl->SetUseSystemFileDialog( bEnable ); } bool SvtMiscOptions::IsUseSystemFileDialogReadOnly() const { - return m_pDataContainer->IsUseSystemFileDialogReadOnly(); + return m_pImpl->IsUseSystemFileDialogReadOnly(); } bool SvtMiscOptions::IsPluginsEnabled() const { - return m_pDataContainer->IsPluginsEnabled(); + return m_pImpl->IsPluginsEnabled(); } sal_Int16 SvtMiscOptions::GetSymbolsSize() const { - return m_pDataContainer->GetSymbolsSize(); + return m_pImpl->GetSymbolsSize(); } void SvtMiscOptions::SetSymbolsSize( sal_Int16 nSet ) { - m_pDataContainer->SetSymbolsSize( nSet ); + m_pImpl->SetSymbolsSize( nSet ); } sal_Int16 SvtMiscOptions::GetCurrentSymbolsSize() const { - sal_Int16 eOptSymbolsSize = m_pDataContainer->GetSymbolsSize(); + sal_Int16 eOptSymbolsSize = m_pImpl->GetSymbolsSize(); if ( eOptSymbolsSize == SFX_SYMBOLS_SIZE_AUTO ) { @@ -749,67 +727,67 @@ OUString SvtMiscOptions::GetIconTheme() const void SvtMiscOptions::SetIconTheme(const OUString& iconTheme) { - m_pDataContainer->SetIconTheme(iconTheme); + m_pImpl->SetIconTheme(iconTheme); } bool SvtMiscOptions::DisableUICustomization() const { - return m_pDataContainer->DisableUICustomization(); + return m_pImpl->DisableUICustomization(); } sal_Int16 SvtMiscOptions::GetToolboxStyle() const { - return m_pDataContainer->GetToolboxStyle(); + return m_pImpl->GetToolboxStyle(); } void SvtMiscOptions::SetToolboxStyle( sal_Int16 nStyle ) { - m_pDataContainer->SetToolboxStyle( nStyle ); + m_pImpl->SetToolboxStyle( nStyle ); } bool SvtMiscOptions::UseSystemPrintDialog() const { - return m_pDataContainer->UseSystemPrintDialog(); + return m_pImpl->UseSystemPrintDialog(); } void SvtMiscOptions::SetUseSystemPrintDialog( bool bEnable ) { - m_pDataContainer->SetUseSystemPrintDialog( bEnable ); + m_pImpl->SetUseSystemPrintDialog( bEnable ); } bool SvtMiscOptions::ShowLinkWarningDialog() const { - return m_pDataContainer->ShowLinkWarningDialog(); + return m_pImpl->ShowLinkWarningDialog(); } void SvtMiscOptions::SetShowLinkWarningDialog( bool bSet ) { - m_pDataContainer->SetShowLinkWarningDialog( bSet ); + m_pImpl->SetShowLinkWarningDialog( bSet ); } bool SvtMiscOptions::IsShowLinkWarningDialogReadOnly() const { - return m_pDataContainer->IsShowLinkWarningDialogReadOnly(); + return m_pImpl->IsShowLinkWarningDialogReadOnly(); } void SvtMiscOptions::SetExperimentalMode( bool bSet ) { - m_pDataContainer->SetExperimentalMode( bSet ); + m_pImpl->SetExperimentalMode( bSet ); } bool SvtMiscOptions::IsExperimentalMode() const { - return m_pDataContainer->IsExperimentalMode(); + return m_pImpl->IsExperimentalMode(); } void SvtMiscOptions::SetMacroRecorderMode( bool bSet ) { - m_pDataContainer->SetMacroRecorderMode( bSet ); + m_pImpl->SetMacroRecorderMode( bSet ); } bool SvtMiscOptions::IsMacroRecorderMode() const { - return m_pDataContainer->IsMacroRecorderMode(); + return m_pImpl->IsMacroRecorderMode(); } namespace @@ -825,18 +803,18 @@ Mutex & SvtMiscOptions::GetInitMutex() void SvtMiscOptions::AddListenerLink( const Link& rLink ) { - m_pDataContainer->AddListenerLink( rLink ); + m_pImpl->AddListenerLink( rLink ); } void SvtMiscOptions::RemoveListenerLink( const Link& rLink ) { - m_pDataContainer->RemoveListenerLink( rLink ); + m_pImpl->RemoveListenerLink( rLink ); } bool SvtMiscOptions::IconThemeWasSetAutomatically() { - return m_pDataContainer->IconThemeWasSetAutomatically(); + return m_pImpl->IconThemeWasSetAutomatically(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3