diff options
author | David Tardon <dtardon@redhat.com> | 2011-04-22 20:03:14 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2011-04-22 20:11:05 +0200 |
commit | 5d19d9e8639fdc4127d90610e34ad88817bd391a (patch) | |
tree | 9fd3da9a4dbaf790806bd684cc78c551cb9513fb /sfx2/inc | |
parent | 66c11b5218ec510c9aff3afb7b141d02dcecc048 (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.hxx | 54 |
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 |