[Libreoffice-commits] .: sfx2/inc

David Tardon dtardon at kemper.freedesktop.org
Fri Apr 22 11:11:25 PDT 2011


 sfx2/inc/sfx2/shell.hxx |   54 ++++++++++++++++++++++++++----------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

New commits:
commit e946e86e8ca146911e4f975738ab1b3575016513
Author: David Tardon <dtardon at redhat.com>
Date:   Fri Apr 22 20:03:14 2011 +0200

    make the init. of this static var thread-safe
    
    (and don't leak memory on exit...)

diff --git a/sfx2/inc/sfx2/shell.hxx b/sfx2/inc/sfx2/shell.hxx
index 04d4aac..ee550b3 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
 


More information about the Libreoffice-commits mailing list