summaryrefslogtreecommitdiff
path: root/sfx2/inc
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2011-04-22 20:03:14 +0200
committerDavid Tardon <dtardon@redhat.com>2011-04-22 20:11:05 +0200
commit5d19d9e8639fdc4127d90610e34ad88817bd391a (patch)
tree9fd3da9a4dbaf790806bd684cc78c551cb9513fb /sfx2/inc
parent66c11b5218ec510c9aff3afb7b141d02dcecc048 (diff)
make the init. of this static var thread-safe
(and don't leak memory on exit...)
Diffstat (limited to 'sfx2/inc')
-rw-r--r--sfx2/inc/sfx2/shell.hxx54
1 files changed, 30 insertions, 24 deletions
diff --git a/sfx2/inc/sfx2/shell.hxx b/sfx2/inc/sfx2/shell.hxx
index b97e76c66954..ffa2c58a1f5d 100644
--- a/sfx2/inc/sfx2/shell.hxx
+++ b/sfx2/inc/sfx2/shell.hxx
@@ -28,10 +28,13 @@
#ifndef _SFX_SHELL_HXX
#define _SFX_SHELL_HXX
+#include <boost/shared_ptr.hpp>
+
#include "sal/config.h"
#include "sfx2/dllapi.h"
#include "sal/types.h"
#include <com/sun/star/embed/VerbDescriptor.hpp>
+#include <rtl/instance.hxx>
#include <tools/debug.hxx>
#include <tools/rtti.hxx>
#include <svl/brdcst.hxx>
@@ -311,9 +314,6 @@ inline void SfxShell::SetPool
#define SFX_SLOTMAP_ARG(ShellClass) static SfxSlot a##ShellClass##Slots_Impl[] =
#define SFX_DECL_INTERFACE(nId) \
- static SfxInterface* pInterface; \
- private: \
- static void InitInterface_Impl(); \
public: \
static const SfxFormalArgument* pSfxFormalArgs_Impl; \
static SfxInterface* GetStaticInterface(); \
@@ -323,21 +323,27 @@ inline void SfxShell::SetPool
#define SFX_IMPL_INTERFACE(Class,SuperClass,NameResId) \
\
- SfxInterface* Class::pInterface = 0; \
const SfxFormalArgument* Class::pSfxFormalArgs_Impl = a##Class##Args_Impl;\
+ static void Init##Class##Interface_Impl(boost::shared_ptr<SfxInterface>& pInterface); \
+ struct Class##Interface_Impl \
+ : public rtl::StaticWithInit<boost::shared_ptr<SfxInterface>, Class##Interface_Impl> \
+ { \
+ boost::shared_ptr<SfxInterface> operator()() const \
+ { \
+ boost::shared_ptr<SfxInterface> pIface( \
+ new SfxInterface( \
+ #Class, NameResId, Class::GetInterfaceId(), \
+ SuperClass::GetStaticInterface(), \
+ a##Class##Slots_Impl[0], \
+ (sal_uInt16) (sizeof(a##Class##Slots_Impl) / sizeof(SfxSlot) ) ) ) \
+ ; \
+ Init##Class##Interface_Impl(pIface); \
+ return pIface; \
+ } \
+ }; \
SfxInterface* Class::GetStaticInterface() \
{ \
- if ( !pInterface ) \
- { \
- pInterface = \
- new SfxInterface( \
- #Class, NameResId, GetInterfaceId(), \
- SuperClass::GetStaticInterface(), \
- a##Class##Slots_Impl[0], \
- (sal_uInt16) (sizeof(a##Class##Slots_Impl) / sizeof(SfxSlot) ) ); \
- InitInterface_Impl(); \
- } \
- return pInterface; \
+ return get_pointer(Class##Interface_Impl::get()); \
} \
\
SfxInterface* Class::GetInterface() const \
@@ -350,7 +356,7 @@ inline void SfxShell::SetPool
GetStaticInterface()->Register(pMod); \
} \
\
- void Class::InitInterface_Impl()
+ void Init##Class##Interface_Impl(boost::shared_ptr<SfxInterface>& pInterface)
#define SFX_POSITION_MASK 0x000F
#define SFX_VISIBILITY_MASK 0xFFF0
@@ -369,28 +375,28 @@ inline void SfxShell::SetPool
#define SFX_VISIBILITY_NOCONTEXT 0xFFFF // Always visable
#define SFX_OBJECTBAR_REGISTRATION(nPos,rResId) \
- GetStaticInterface()->RegisterObjectBar( nPos, rResId )
+ pInterface->RegisterObjectBar( nPos, rResId )
#define SFX_FEATURED_OBJECTBAR_REGISTRATION(nPos,rResId,nFeature) \
- GetStaticInterface()->RegisterObjectBar( nPos, rResId, nFeature )
+ pInterface->RegisterObjectBar( nPos, rResId, nFeature )
#define SFX_CHILDWINDOW_REGISTRATION(nId) \
- GetStaticInterface()->RegisterChildWindow( nId, (sal_Bool) sal_False )
+ pInterface->RegisterChildWindow( nId, (sal_Bool) sal_False )
#define SFX_FEATURED_CHILDWINDOW_REGISTRATION(nId,nFeature) \
- GetStaticInterface()->RegisterChildWindow( nId, (sal_Bool) sal_False, nFeature )
+ pInterface->RegisterChildWindow( nId, (sal_Bool) sal_False, nFeature )
#define SFX_CHILDWINDOW_CONTEXT_REGISTRATION(nId) \
- GetStaticInterface()->RegisterChildWindow( nId, (sal_Bool) sal_True )
+ pInterface->RegisterChildWindow( nId, (sal_Bool) sal_True )
#define SFX_POPUPMENU_REGISTRATION(rResId) \
- GetStaticInterface()->RegisterPopupMenu( rResId )
+ pInterface->RegisterPopupMenu( rResId )
#define SFX_OBJECTMENU_REGISTRATION(nPos,rResId) \
- GetStaticInterface()->RegisterObjectMenu( nPos, rResId )
+ pInterface->RegisterObjectMenu( nPos, rResId )
#define SFX_STATUSBAR_REGISTRATION(rResId) \
- GetStaticInterface()->RegisterStatusBar( rResId )
+ pInterface->RegisterStatusBar( rResId )
#endif