[Libreoffice-commits] core.git: vcl/source

Mike Kaganski (via logerrit) logerrit at kemper.freedesktop.org
Fri Jan 24 09:02:30 UTC 2020


 vcl/source/app/svmain.cxx |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

New commits:
commit 9a2fc64b49b4a3067ba78648e3fcc73390717c80
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Fri Jan 24 08:14:15 2020 +0300
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Fri Jan 24 10:01:55 2020 +0100

    Prevent deadlock in DeInitVCL() on Windows
    
    Seen in local make check build:
    
    1. A unit test is being finished, calling DeInitVCL() in main thread, which
       holds solar mutex; it is now attempting to dispose clipboard listener,
       which needs to lock CWinClipbImpl::s_aMutex:
    
    =====
    sysdtrans.dll!osl::Guard<osl::Mutex>::Guard<osl::Mutex>(osl::Mutex & t) Line 136
            at C:\lo\src\core\include\osl\mutex.hxx(136)
    sysdtrans.dll!CWinClipbImpl::~CWinClipbImpl() Line 67
            at C:\lo\src\core\dtrans\source\win32\clipb\WinClipbImpl.cxx(67)
    sysdtrans.dll!CWinClipbImpl::`scalar deleting destructor'(unsigned int)
    sysdtrans.dll!std::default_delete<CWinClipbImpl>::operator()(CWinClipbImpl * _Ptr) Line 1765
            at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\memory(1765)
    sysdtrans.dll!std::unique_ptr<CWinClipbImpl,std::default_delete<CWinClipbImpl>>::reset(CWinClipbImpl * _Ptr) Line 1908
            at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\memory(1908)
    sysdtrans.dll!CWinClipboard::disposing() Line 220
            at C:\lo\src\core\dtrans\source\win32\clipb\WinClipboard.cxx(220)
    cppuhelper3MSC.dll!cppu::WeakComponentImplHelperBase::dispose() Line 102
            at C:\lo\src\core\cppuhelper\source\implbase.cxx(102)
    sysdtrans.dll!cppu::PartialWeakComponentImplHelper<com::sun::star::datatransfer::clipboard::XSystemClipboard,com::sun::star::datatransfer::clipboard::XFlushableClipboard,com::sun::star::lang::XServiceInfo>::dispose() Line 90
            at C:\lo\src\core\include\cppuhelper\compbase.hxx(90)
    vcllo.dll!DeInitVCL() Line 492
            at C:\lo\src\core\vcl\source\app\svmain.cxx(492)
    vclbootstrapprotector.dll!`anonymous namespace'::Protector::~Protector() Line 32
            at C:\lo\src\core\test\source\vclbootstrapprotector.cxx(32)
    vclbootstrapprotector.dll!`anonymous namespace'::Protector::`scalar deleting destructor'(unsigned int)
    cppunitd_dll.dll!CppUnit::ProtectorChain::pop() Line 56
            at C:\lo\src\build\workdir\UnpackedTarball\cppunit\src\cppunit\ProtectorChain.cpp(56)
    cppunitd_dll.dll!CppUnit::TestResult::popProtector() Line 197
            at C:\lo\src\build\workdir\UnpackedTarball\cppunit\src\cppunit\TestResult.cpp(197)
    cppunittester.exe!`anonymous namespace'::ProtectedFixtureFunctor::run() Line 325
            at C:\lo\src\core\sal\cppunittester\cppunittester.cxx(325)
    cppunittester.exe!sal_main() Line 466
            at C:\lo\src\core\sal\cppunittester\cppunittester.cxx(466)
    cppunittester.exe!main(int argc, char * * argv) Line 373
            at C:\lo\src\core\sal\cppunittester\cppunittester.cxx(373)
    =====
    
    2. Simultaneously, clipboard listener thread calls onClipboardContentChanged,
       which has locked CWinClipbImpl::s_aMutex, and now it's trying to post user
       event in SfxClipboardChangeListener::changedContents, which needs to lock
       solar mutex in ImplGetDefaultContextWindow:
    
    =====
    comphelper.dll!comphelper::SolarMutex::acquire(unsigned long nLockCount) Line 87
            at C:\lo\src\core\include\comphelper\solarmutex.hxx(87)
    vcllo.dll!osl::Guard<comphelper::SolarMutex>::Guard<comphelper::SolarMutex>(comphelper::SolarMutex & t) Line 136
            at C:\lo\src\core\include\osl\mutex.hxx(136)
    vcllo.dll!SolarMutexGuard::SolarMutexGuard() Line 1343
            at C:\lo\src\core\include\vcl\svapp.hxx(1343)
    vcllo.dll!ImplGetDefaultContextWindow() Line 227
            at C:\lo\src\core\vcl\source\app\svdata.cxx(227)
    vcllo.dll!ImplGetDefaultWindow() Line 217
            at C:\lo\src\core\vcl\source\app\svdata.cxx(217)
    vcllo.dll!Application::PostUserEvent(const Link<void *,void> & rLink, void * pCaller, bool bReferenceLink) Line 1000
            at C:\lo\src\core\vcl\source\app\svapp.cxx(1000)
    sfxlo.dll!SfxClipboardChangeListener::changedContents(const com::sun::star::datatransfer::clipboard::ClipboardEvent & __formal) Line 215
            at C:\lo\src\core\sfx2\source\view\viewsh.cxx(215)
    sysdtrans.dll!CWinClipboard::notifyAllClipboardListener() Line 189
            at C:\lo\src\core\dtrans\source\win32\clipb\WinClipboard.cxx(189)
    sysdtrans.dll!CWinClipbImpl::onClipboardContentChanged() Line 179
            at C:\lo\src\core\dtrans\source\win32\clipb\WinClipbImpl.cxx(179)
    sysdtrans.dll!CMtaOleClipboard::clipboardChangedNotifierThreadProc(void * pParam) Line 705
            at C:\lo\src\core\dtrans\source\win32\clipb\MtaOleClipb.cxx(705)
    ucrtbased.dll!thread_start<unsigned int (__cdecl*)(void *),1>(void * const parameter) Line 97
            at minkernel\crts\ucrt\src\appcrt\startup\thread.cpp(97)
    kernel32.dll!BaseThreadInitThunk()
    ntdll.dll!RtlUserThreadStart()
    =====
    
    => the two threads deadlock waiting for mutexes locked in each other.
    
    Resolve it by using SolarMutexReleaser around the call disposing the clipboard
    listener in DeInitVCL. An alternative could be using solar mutex instead of
    CWinClipbImpl::s_aMutex.
    
    Change-Id: Ifd76ce5a7d969a568539602eae2139b4ef0c5858
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87318
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>

diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index bfa5279ca4ca..998ece19dc21 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -489,7 +489,8 @@ void DeInitVCL()
     if (auto const comp = css::uno::Reference<css::lang::XComponent>(
             pSVData->m_xSystemClipboard, css::uno::UNO_QUERY))
     {
-        comp->dispose();
+        SolarMutexReleaser r; // unblock pending "clipboard content changed" notifications
+        comp->dispose(); // will use CWinClipbImpl::s_aMutex
     }
 #endif
 


More information about the Libreoffice-commits mailing list