summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2016-06-15 19:49:05 +0200
committerNoel Grandin <noelgrandin@gmail.com>2016-06-16 06:44:31 +0000
commit6cf574071e83663f8e1bcf70b0135a6258788a29 (patch)
treea3dbcb480a099f369ff1b57fdccbc926676b7212
parent11c2acfa5a837b7d1fff31e20a87eddbba08f742 (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.hxx24
-rw-r--r--unotools/source/config/cmdoptions.cxx38
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