[Libreoffice-commits] core.git: Branch 'feature/fixes36' - 2 commits - dtrans/source

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Tue Nov 22 20:43:51 UTC 2016


 dtrans/source/win32/clipb/MtaOleClipb.cxx |   31 +++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

New commits:
commit 4d833a75423b8aa2e938d0247f89661a4c8efcbf
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue Nov 15 15:36:20 2016 +0100

    tdf#103852 avoid clipboard deadlock
    
    Change-Id: If0c5f01d0aefd2444781612d47d8145b4869f3a1

diff --git a/dtrans/source/win32/clipb/MtaOleClipb.cxx b/dtrans/source/win32/clipb/MtaOleClipb.cxx
index 843a73d..c5b5718 100644
--- a/dtrans/source/win32/clipb/MtaOleClipb.cxx
+++ b/dtrans/source/win32/clipb/MtaOleClipb.cxx
@@ -200,15 +200,17 @@ class CAutoComInit
 public:
     CAutoComInit( )
     {
-        /*
-            to be safe we call CoInitialize
-            although it is not necessary if
-            the calling thread was created
-            using osl_CreateThread because
-            this function calls CoInitialize
-            for every thread it creates
+        /* To be safe we call CoInitializeEx although it is not necessary if
+           the calling thread was created using osl_CreateThread because
+           this function calls CoInitializeEx for every thread it creates.
+
+           We initialize with COINIT_APARTMENTTHREADED so Mulit-Threaded
+           Apartments(MTA) are used. See [1] for more details about STA and MTA
+           modes.
+
+           [1] https://msdn.microsoft.com/en-us/library/ms809971.aspx
         */
-        m_hResult = CoInitialize( NULL );
+        m_hResult = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
 
         if ( S_OK == m_hResult )
             OSL_FAIL( \
@@ -220,15 +222,10 @@ public:
 
     ~CAutoComInit( )
     {
-        /*
-            we only call CoUninitialize when
-            CoInitialize returned S_FALSE, what
-            means that com was already initialize
-            for that thread so we keep the balance
-            if CoInitialize returned S_OK what means
-            com was not yet initialized we better
-            let com initialized or we may run into
-            the realm of undefined behaviour
+        /* We only call CoUninitialize when CoInitialize returned S_FALSE, what
+           means that com was already initialize for that thread so we keep the balance
+           if CoInitialize returned S_OK what means com was not yet initialized we better
+           let com initialized or we may run into the realm of undefined behaviour
         */
         if ( m_hResult == S_FALSE )
             CoUninitialize( );
diff --git a/dtrans/source/win32/dtobj/XTDataObject.cxx b/dtrans/source/win32/dtobj/XTDataObject.cxx
index 51108a1..ad1c9f0 100644
--- a/dtrans/source/win32/dtobj/XTDataObject.cxx
+++ b/dtrans/source/win32/dtobj/XTDataObject.cxx
@@ -25,8 +25,11 @@
 #include "DTransHelper.hxx"
 #include "TxtCnvtHlp.hxx"
 #include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp>
+#include "com/sun/star/awt/AsyncCallback.hpp"
+#include "com/sun/star/awt/XCallback.hpp"
 #include "FmtFilter.hxx"
 #include <comphelper/processfactory.hxx>
+#include <cppuhelper/implbase.hxx>
 
 #if defined _MSC_VER
 #pragma warning(push,1)
@@ -52,6 +55,22 @@ using namespace com::sun::star::datatransfer::clipboard;
 using namespace com::sun::star::uno;
 using namespace com::sun::star::lang;
 
+
+class AsyncDereference : public cppu::WeakImplHelper<css::awt::XCallback>
+{
+    Reference<XTransferable> maTransferable;
+public:
+    AsyncDereference(css::uno::Reference<css::datatransfer::XTransferable> const & rTransferable)
+        : maTransferable(rTransferable)
+    {}
+
+    virtual void SAL_CALL notify(css::uno::Any const &)
+        throw (css::uno::RuntimeException, std::exception) override
+    {
+        maTransferable.set(nullptr);
+    }
+};
+
 // a helper class that will be thrown by the function validateFormatEtc
 
 class CInvalidFormatEtcException
@@ -67,12 +86,20 @@ CXTDataObject::CXTDataObject( const Reference< XComponentContext >& rxContext,
                               const Reference< XTransferable >& aXTransferable )
     : m_nRefCnt( 0 )
     , m_XTransferable( aXTransferable )
+    , m_XComponentContext( rxContext )
     , m_bFormatEtcContainerInitialized( sal_False )
     , m_DataFormatTranslator( rxContext )
     , m_FormatRegistrar( rxContext, m_DataFormatTranslator )
 {
 }
 
+CXTDataObject::~CXTDataObject()
+{
+    css::awt::AsyncCallback::create(m_XComponentContext)->addCallback(
+        new AsyncDereference(m_XTransferable),
+        css::uno::Any());
+}
+
 // IUnknown->QueryInterface
 
 STDMETHODIMP CXTDataObject::QueryInterface( REFIID iid, LPVOID* ppvObject )
diff --git a/dtrans/source/win32/dtobj/XTDataObject.hxx b/dtrans/source/win32/dtobj/XTDataObject.hxx
index 3d8d71c..f9e98e8 100644
--- a/dtrans/source/win32/dtobj/XTDataObject.hxx
+++ b/dtrans/source/win32/dtobj/XTDataObject.hxx
@@ -64,7 +64,7 @@ class CXTDataObject : public IDataObject
 public:
     CXTDataObject( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
                    const css::uno::Reference< css::datatransfer::XTransferable >& aXTransferable );
-    virtual ~CXTDataObject() {}
+    virtual ~CXTDataObject();
 
     // ole interface implementation
 
@@ -118,6 +118,7 @@ private:
 private:
     LONG m_nRefCnt;
     css::uno::Reference< css::datatransfer::XTransferable >      m_XTransferable;
+    css::uno::Reference< css::uno::XComponentContext>            m_XComponentContext;
     CFormatEtcContainer                                          m_FormatEtcContainer;
     sal_Bool                                                     m_bFormatEtcContainerInitialized;
     CDataFormatTranslator                                        m_DataFormatTranslator;
diff --git a/toolkit/source/awt/asynccallback.cxx b/toolkit/source/awt/asynccallback.cxx
index 2d30afe..9268cb5 100644
--- a/toolkit/source/awt/asynccallback.cxx
+++ b/toolkit/source/awt/asynccallback.cxx
@@ -88,8 +88,7 @@ void SAL_CALL AsyncCallback::addCallback(const css::uno::Reference< css::awt::XC
 {
     if ( Application::IsInMain() )
     {
-        SolarMutexGuard aSolarGuard;
-
+        // NOTE: We don't need SolarMutexGuard here as Application::PostUserEvent is thread-safe
         CallbackData* pCallbackData = new CallbackData( xCallback, aData );
         Application::PostUserEvent( LINK( this, AsyncCallback, Notify_Impl ), pCallbackData );
     }
commit 11919ea148cee39af001acbe9e8e5987be6b58a8
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue Nov 22 21:42:48 2016 +0100

    Revert "tdf#103852 avoid clipboard deadlock"
    
    This reverts commit fd42457d52b68c60f2cbbd518648044821bb13c9.

diff --git a/dtrans/source/win32/dtobj/XTDataObject.cxx b/dtrans/source/win32/dtobj/XTDataObject.cxx
index ad1c9f0..51108a1 100644
--- a/dtrans/source/win32/dtobj/XTDataObject.cxx
+++ b/dtrans/source/win32/dtobj/XTDataObject.cxx
@@ -25,11 +25,8 @@
 #include "DTransHelper.hxx"
 #include "TxtCnvtHlp.hxx"
 #include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp>
-#include "com/sun/star/awt/AsyncCallback.hpp"
-#include "com/sun/star/awt/XCallback.hpp"
 #include "FmtFilter.hxx"
 #include <comphelper/processfactory.hxx>
-#include <cppuhelper/implbase.hxx>
 
 #if defined _MSC_VER
 #pragma warning(push,1)
@@ -55,22 +52,6 @@ using namespace com::sun::star::datatransfer::clipboard;
 using namespace com::sun::star::uno;
 using namespace com::sun::star::lang;
 
-
-class AsyncDereference : public cppu::WeakImplHelper<css::awt::XCallback>
-{
-    Reference<XTransferable> maTransferable;
-public:
-    AsyncDereference(css::uno::Reference<css::datatransfer::XTransferable> const & rTransferable)
-        : maTransferable(rTransferable)
-    {}
-
-    virtual void SAL_CALL notify(css::uno::Any const &)
-        throw (css::uno::RuntimeException, std::exception) override
-    {
-        maTransferable.set(nullptr);
-    }
-};
-
 // a helper class that will be thrown by the function validateFormatEtc
 
 class CInvalidFormatEtcException
@@ -86,20 +67,12 @@ CXTDataObject::CXTDataObject( const Reference< XComponentContext >& rxContext,
                               const Reference< XTransferable >& aXTransferable )
     : m_nRefCnt( 0 )
     , m_XTransferable( aXTransferable )
-    , m_XComponentContext( rxContext )
     , m_bFormatEtcContainerInitialized( sal_False )
     , m_DataFormatTranslator( rxContext )
     , m_FormatRegistrar( rxContext, m_DataFormatTranslator )
 {
 }
 
-CXTDataObject::~CXTDataObject()
-{
-    css::awt::AsyncCallback::create(m_XComponentContext)->addCallback(
-        new AsyncDereference(m_XTransferable),
-        css::uno::Any());
-}
-
 // IUnknown->QueryInterface
 
 STDMETHODIMP CXTDataObject::QueryInterface( REFIID iid, LPVOID* ppvObject )
diff --git a/dtrans/source/win32/dtobj/XTDataObject.hxx b/dtrans/source/win32/dtobj/XTDataObject.hxx
index f9e98e8..3d8d71c 100644
--- a/dtrans/source/win32/dtobj/XTDataObject.hxx
+++ b/dtrans/source/win32/dtobj/XTDataObject.hxx
@@ -64,7 +64,7 @@ class CXTDataObject : public IDataObject
 public:
     CXTDataObject( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
                    const css::uno::Reference< css::datatransfer::XTransferable >& aXTransferable );
-    virtual ~CXTDataObject();
+    virtual ~CXTDataObject() {}
 
     // ole interface implementation
 
@@ -118,7 +118,6 @@ private:
 private:
     LONG m_nRefCnt;
     css::uno::Reference< css::datatransfer::XTransferable >      m_XTransferable;
-    css::uno::Reference< css::uno::XComponentContext>            m_XComponentContext;
     CFormatEtcContainer                                          m_FormatEtcContainer;
     sal_Bool                                                     m_bFormatEtcContainerInitialized;
     CDataFormatTranslator                                        m_DataFormatTranslator;
diff --git a/toolkit/source/awt/asynccallback.cxx b/toolkit/source/awt/asynccallback.cxx
index 9268cb5..2d30afe 100644
--- a/toolkit/source/awt/asynccallback.cxx
+++ b/toolkit/source/awt/asynccallback.cxx
@@ -88,7 +88,8 @@ void SAL_CALL AsyncCallback::addCallback(const css::uno::Reference< css::awt::XC
 {
     if ( Application::IsInMain() )
     {
-        // NOTE: We don't need SolarMutexGuard here as Application::PostUserEvent is thread-safe
+        SolarMutexGuard aSolarGuard;
+
         CallbackData* pCallbackData = new CallbackData( xCallback, aData );
         Application::PostUserEvent( LINK( this, AsyncCallback, Notify_Impl ), pCallbackData );
     }


More information about the Libreoffice-commits mailing list