[Libreoffice-commits] core.git: Branch 'feature/fixes35' - 2 commits - embeddedobj/source svtools/source

Markus Mohrhard markus.mohrhard at googlemail.com
Tue Sep 13 16:53:09 UTC 2016


 embeddedobj/source/commonembedding/miscobj.cxx |   22 ++++++++++++----------
 svtools/source/misc/transfer.cxx               |    4 ----
 2 files changed, 12 insertions(+), 14 deletions(-)

New commits:
commit e233fe86fba26a9db260164e44d387de0d22ac8d
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Jul 14 21:59:30 2016 +0200

    try to avoid the deadlock around the clipboard, tdf#56818
    
    This deadlocks in the case that we have an external process
    communicating with LibreOffice as the SolarMutexReleaser allows a
    connection to be processed while the normal code has just released the
    SolarMutex. If the external call code now goes down the same code path
    we deadlock on the SolarMutex together with other mutexes in the
    clipboard code.
    
    Change-Id: I18fd6953c9566452a31b1a4c32c68494ec7a52ac
    Reviewed-on: https://gerrit.libreoffice.org/27251
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx
index f21d861..fbfb9d2 100644
--- a/svtools/source/misc/transfer.cxx
+++ b/svtools/source/misc/transfer.cxx
@@ -922,8 +922,6 @@ void TransferableHelper::CopyToClipboard( vcl::Window *pWindow ) const
 
     if( mxClipboard.is() && !mxTerminateListener.is() )
     {
-        SolarMutexReleaser aReleaser;
-
         try
         {
             TransferableHelper*                 pThis = const_cast< TransferableHelper* >( this );
@@ -949,8 +947,6 @@ void TransferableHelper::CopyToSelection( vcl::Window *pWindow ) const
 
     if( xSelection.is() && !mxTerminateListener.is() )
     {
-        SolarMutexReleaser aReleaser;
-
         try
         {
             TransferableHelper*                 pThis = const_cast< TransferableHelper* >( this );
commit f5dc9bf0a896da8602661978cfa7b2970244ea7d
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jul 8 09:07:44 2016 +0200

    tdf#56818, use SolarMutex instead of own Mutex
    
    There is a SolarMutexReleaser in the call chain so that using an own
    mutex can deadlock.
    
    Change-Id: I1dd0b0c78ce6cf436a470319e616099cb947b6e0
    Reviewed-on: https://gerrit.libreoffice.org/27085
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/embeddedobj/source/commonembedding/miscobj.cxx b/embeddedobj/source/commonembedding/miscobj.cxx
index bba9f26..00464a7 100644
--- a/embeddedobj/source/commonembedding/miscobj.cxx
+++ b/embeddedobj/source/commonembedding/miscobj.cxx
@@ -32,6 +32,8 @@
 #include <comphelper/mimeconfighelper.hxx>
 #include <comphelper/processfactory.hxx>
 
+#include <vcl/svapp.hxx>
+
 #include "closepreventer.hxx"
 #include "intercept.hxx"
 #include "persistence.hxx"
@@ -435,7 +437,7 @@ void SAL_CALL OCommonEmbeddedObject::setClassInfo(
 uno::Reference< util::XCloseable > SAL_CALL OCommonEmbeddedObject::getComponent()
         throw ( uno::RuntimeException, std::exception )
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_bDisposed )
         throw lang::DisposedException(); // TODO
 
@@ -454,7 +456,7 @@ uno::Reference< util::XCloseable > SAL_CALL OCommonEmbeddedObject::getComponent(
 void SAL_CALL OCommonEmbeddedObject::addStateChangeListener( const uno::Reference< embed::XStateChangeListener >& xListener )
     throw ( uno::RuntimeException, std::exception )
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_bDisposed )
         throw lang::DisposedException(); // TODO
 
@@ -470,7 +472,7 @@ void SAL_CALL OCommonEmbeddedObject::removeStateChangeListener(
                     const uno::Reference< embed::XStateChangeListener >& xListener )
     throw (uno::RuntimeException, std::exception)
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_pInterfaceContainer )
         m_pInterfaceContainer->removeInterface( cppu::UnoType<embed::XStateChangeListener>::get(),
                                                 xListener );
@@ -481,7 +483,7 @@ void SAL_CALL OCommonEmbeddedObject::close( sal_Bool bDeliverOwnership )
     throw ( util::CloseVetoException,
             uno::RuntimeException, std::exception )
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_bClosed )
         throw lang::DisposedException(); // TODO
 
@@ -585,12 +587,12 @@ void SAL_CALL OCommonEmbeddedObject::close( sal_Bool bDeliverOwnership )
 void SAL_CALL OCommonEmbeddedObject::addCloseListener( const uno::Reference< util::XCloseListener >& xListener )
     throw ( uno::RuntimeException, std::exception )
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_bDisposed )
         throw lang::DisposedException(); // TODO
 
     if ( !m_pInterfaceContainer )
-        m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
+        m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper(m_aMutex);
 
     m_pInterfaceContainer->addInterface( cppu::UnoType<util::XCloseListener>::get(), xListener );
 }
@@ -599,7 +601,7 @@ void SAL_CALL OCommonEmbeddedObject::addCloseListener( const uno::Reference< uti
 void SAL_CALL OCommonEmbeddedObject::removeCloseListener( const uno::Reference< util::XCloseListener >& xListener )
     throw (uno::RuntimeException, std::exception)
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_pInterfaceContainer )
         m_pInterfaceContainer->removeInterface( cppu::UnoType<util::XCloseListener>::get(),
                                                 xListener );
@@ -609,12 +611,12 @@ void SAL_CALL OCommonEmbeddedObject::removeCloseListener( const uno::Reference<
 void SAL_CALL OCommonEmbeddedObject::addEventListener( const uno::Reference< document::XEventListener >& xListener )
         throw ( uno::RuntimeException, std::exception )
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_bDisposed )
         throw lang::DisposedException(); // TODO
 
     if ( !m_pInterfaceContainer )
-        m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
+        m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper(m_aMutex);
 
     m_pInterfaceContainer->addInterface( cppu::UnoType<document::XEventListener>::get(), xListener );
 }
@@ -623,7 +625,7 @@ void SAL_CALL OCommonEmbeddedObject::addEventListener( const uno::Reference< doc
 void SAL_CALL OCommonEmbeddedObject::removeEventListener( const uno::Reference< document::XEventListener >& xListener )
         throw ( uno::RuntimeException, std::exception )
 {
-    ::osl::MutexGuard aGuard( m_aMutex );
+    SolarMutexGuard aGuard;
     if ( m_pInterfaceContainer )
         m_pInterfaceContainer->removeInterface( cppu::UnoType<document::XEventListener>::get(),
                                                 xListener );


More information about the Libreoffice-commits mailing list