diff options
author | Xisco Fauli <anistenis@gmail.com> | 2016-06-15 19:49:05 +0200 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2016-06-16 06:44:31 +0000 |
commit | 6cf574071e83663f8e1bcf70b0135a6258788a29 (patch) | |
tree | a3dbcb480a099f369ff1b57fdccbc926676b7212 | |
parent | 11c2acfa5a837b7d1fff31e20a87eddbba08f742 (diff) |
tdf#89329: use shared_ptr for pImpl in cmdoptions
Change-Id: Ie6297cf8c26964a6c7cc017c1257c61825c2c791
Reviewed-on: https://gerrit.libreoffice.org/26320
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
-rw-r--r-- | include/unotools/cmdoptions.hxx | 24 | ||||
-rw-r--r-- | unotools/source/config/cmdoptions.cxx | 38 |
2 files changed, 13 insertions, 49 deletions
diff --git a/include/unotools/cmdoptions.hxx b/include/unotools/cmdoptions.hxx index 8e0b48782f4e..b5d0ad854893 100644 --- a/include/unotools/cmdoptions.hxx +++ b/include/unotools/cmdoptions.hxx @@ -25,6 +25,7 @@ #include <com/sun/star/frame/XFrame.hpp> #include <rtl/ustring.hxx> #include <unotools/options.hxx> +#include <memory> /*-************************************************************************************************************ @descr The method GetList() returns a list of property values. @@ -58,17 +59,6 @@ class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtCommandOptions : public utl::detail: CMDOPTION_NONE }; - /*-**************************************************************************************************** - @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 - *//*-*****************************************************************************************************/ - SvtCommandOptions(); virtual ~SvtCommandOptions(); @@ -121,17 +111,7 @@ class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtCommandOptions : public utl::detail: UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); 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 SvtCommandOptions_Impl* m_pDataContainer; - static sal_Int32 m_nRefCount; + std::shared_ptr<SvtCommandOptions_Impl> m_pImpl; }; // class SvtCmdOptions diff --git a/unotools/source/config/cmdoptions.cxx b/unotools/source/config/cmdoptions.cxx index 82e5a93167d4..0fb89bee6343 100644 --- a/unotools/source/config/cmdoptions.cxx +++ b/unotools/source/config/cmdoptions.cxx @@ -286,44 +286,28 @@ Sequence< OUString > SvtCommandOptions_Impl::impl_GetPropertyNames() return lDisabledItems; } -// initialize static member -// DON'T DO IT IN YOUR HEADER! -// see definition for further information - -SvtCommandOptions_Impl* SvtCommandOptions::m_pDataContainer = nullptr; -sal_Int32 SvtCommandOptions::m_nRefCount = 0; - -// constructor +std::weak_ptr<SvtCommandOptions_Impl> m_pCommandOptions; SvtCommandOptions::SvtCommandOptions() { // Global access, must be guarded (multithreading!). MutexGuard aGuard( GetOwnStaticMutex() ); - // Increase our refcount ... - ++m_nRefCount; - // ... and initialize our data container only if it not already exist! - if( m_pDataContainer == nullptr ) + + m_pImpl = m_pCommandOptions.lock(); + if( !m_pImpl ) { - m_pDataContainer = new SvtCommandOptions_Impl; + m_pImpl = std::make_shared<SvtCommandOptions_Impl>(); + m_pCommandOptions = m_pImpl; ItemHolder1::holdConfigItem(E_CMDOPTIONS); } } -// destructor - SvtCommandOptions::~SvtCommandOptions() { // Global access, must be guarded (multithreading!) MutexGuard aGuard( GetOwnStaticMutex() ); - // 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(); } // public method @@ -331,7 +315,7 @@ SvtCommandOptions::~SvtCommandOptions() bool SvtCommandOptions::HasEntries( CmdOption eOption ) const { MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->HasEntries( eOption ); + return m_pImpl->HasEntries( eOption ); } // public method @@ -339,7 +323,7 @@ bool SvtCommandOptions::HasEntries( CmdOption eOption ) const bool SvtCommandOptions::Lookup( CmdOption eCmdOption, const OUString& aCommandURL ) const { MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->Lookup( eCmdOption, aCommandURL ); + return m_pImpl->Lookup( eCmdOption, aCommandURL ); } // public method @@ -347,7 +331,7 @@ bool SvtCommandOptions::Lookup( CmdOption eCmdOption, const OUString& aCommandUR void SvtCommandOptions::EstablisFrameCallback(const css::uno::Reference< css::frame::XFrame >& xFrame) { MutexGuard aGuard( GetOwnStaticMutex() ); - m_pDataContainer->EstablisFrameCallback(xFrame); + m_pImpl->EstablisFrameCallback(xFrame); } namespace |