include/unotools/dynamicmenuoptions.hxx | 24 +--------------- unotools/source/config/dynamicmenuoptions.cxx | 37 ++++++++------------------ 2 files changed, 14 insertions(+), 47 deletions(-)
New commits: commit a1f836e40d30fa39478e31ed8bc7bd947d4803c9 Author: Xisco Fauli <aniste...@gmail.com> Date: Wed Jun 15 20:26:14 2016 +0200 tdf#89329: use shared_ptr for pImpl in dynamicmenuoptions Change-Id: I66bdeeee7f70e6ca16a39e8804aaf8a5f0d08205 Reviewed-on: https://gerrit.libreoffice.org/26327 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Noel Grandin <noelgran...@gmail.com> diff --git a/include/unotools/dynamicmenuoptions.hxx b/include/unotools/dynamicmenuoptions.hxx index e56d27a..d78c894 100644 --- a/include/unotools/dynamicmenuoptions.hxx +++ b/include/unotools/dynamicmenuoptions.hxx @@ -25,6 +25,7 @@ #include <com/sun/star/uno/Sequence.h> #include <com/sun/star/beans/PropertyValue.hpp> #include <unotools/options.hxx> +#include <memory> /*-************************************************************************************************************ @descr The method GetList() returns a list of property values. @@ -63,17 +64,6 @@ class SvtDynamicMenuOptions_Impl; class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtDynamicMenuOptions : 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 - *//*-*****************************************************************************************************/ - SvtDynamicMenuOptions(); virtual ~SvtDynamicMenuOptions(); @@ -101,17 +91,7 @@ class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtDynamicMenuOptions : public utl::det 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 SvtDynamicMenuOptions_Impl* m_pDataContainer; - static sal_Int32 m_nRefCount; + std::shared_ptr<SvtDynamicMenuOptions_Impl> m_pImpl; }; // class SvtDynamicMenuOptions diff --git a/unotools/source/config/dynamicmenuoptions.cxx b/unotools/source/config/dynamicmenuoptions.cxx index 38c94a1..1d95ca1 100644 --- a/unotools/source/config/dynamicmenuoptions.cxx +++ b/unotools/source/config/dynamicmenuoptions.cxx @@ -566,44 +566,31 @@ void SvtDynamicMenuOptions_Impl::impl_SortAndExpandPropertyNames( const Sequence } } -// initialize static member -// DON'T DO IT IN YOUR HEADER! -// see definition for further information - -SvtDynamicMenuOptions_Impl* SvtDynamicMenuOptions::m_pDataContainer = nullptr; -sal_Int32 SvtDynamicMenuOptions::m_nRefCount = 0; - -// constructor +namespace { + // global + std::weak_ptr<SvtDynamicMenuOptions_Impl> g_pDynamicMenuOptions; +} SvtDynamicMenuOptions::SvtDynamicMenuOptions() { // 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 = g_pDynamicMenuOptions.lock(); + if( !m_pImpl ) { - m_pDataContainer = new SvtDynamicMenuOptions_Impl; + m_pImpl = std::make_shared<SvtDynamicMenuOptions_Impl>(); + g_pDynamicMenuOptions = m_pImpl; ItemHolder1::holdConfigItem(E_DYNAMICMENUOPTIONS); } } -// destructor - SvtDynamicMenuOptions::~SvtDynamicMenuOptions() { // 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 @@ -611,7 +598,7 @@ SvtDynamicMenuOptions::~SvtDynamicMenuOptions() Sequence< Sequence< PropertyValue > > SvtDynamicMenuOptions::GetMenu( EDynamicMenuType eMenu ) const { MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->GetMenu( eMenu ); + return m_pImpl->GetMenu( eMenu ); } namespace _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits