tdf#89329: use shared_ptr for pImpl in dynamicmenuoptions

Change-Id: I66bdeeee7f70e6ca16a39e8804aaf8a5f0d08205
Reviewed-on: https://gerrit.libreoffice.org/26327
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
This commit is contained in:
Xisco Fauli 2016-06-15 20:26:14 +02:00 committed by Noel Grandin
parent f35b1397ae
commit a1f836e40d
2 changed files with 14 additions and 47 deletions

View File

@ -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

View File

@ -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