Kaydet (Commit) 775bf23f authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Prevent SolarMutex deadlock in unit test

Seen once a deadlock between

d 12 (Thread 0x2af5a4c8a700 (LWP 7618)):
> #0  0x00002af58ac97ddd in __lll_lock_wait () from /lib64/libpthread.so.0
> #1  0x00002af58ac93bbc in _L_lock_839 () from /lib64/libpthread.so.0
> #2  0x00002af58ac93ad9 in pthread_mutex_lock () from /lib64/libpthread.so.0
> #3  0x00002af589e2383a in osl_acquireMutex (pMutex=0x9329b0) at sal/osl/unx/mutex.c:104
> #4  0x00002af598d577ec in vcl::SolarMutexObject::acquire (this=0x8dd120) at vcl/source/app/solarmutex.cxx:35
> #5  0x00002af599305c82 in SalYieldMutex::acquire (this=0x8dd120) at vcl/generic/app/geninst.cxx:49
> #6  0x00002af59e9bfb7b in framework::LockHelper::acquireReadAccess (this=0x2af5a2406088) at framework/source/fwi/threadhelp/lockhelper.cxx:150
> #7  0x00002af59ca29ccf in framework::ReadGuard::lock (this=0x2af5a4c894c0) at framework/inc/threadhelp/readguard.hxx:113
> #8  0x00002af59ca29c81 in framework::ReadGuard::ReadGuard (this=0x2af5a4c894c0, rLock=...) at framework/inc/threadhelp/readguard.hxx:79
> #9  0x00002af59cb52fce in (anonymous namespace)::Frame::getContainerWindow (this=0x2af5a2406010) at framework/source/services/frame.cxx:985
> #10 0x00002af5a32582d2 in tdoc_ucp::OfficeDocumentsManager::isWithoutOrInTopLevelFrame (this=0x2af5a24a1f18, xModel=uno::Reference to (dbaccess::ODatabaseDocument *) 0x2af5a4edc5a8) at ucb/source/ucp/tdoc/tdoc_docmgr.cxx:626
> #11 0x00002af5a325870f in tdoc_ucp::OfficeDocumentsManager::isOfficeDocument (this=0x2af5a24a1f18, xDoc=uno::Reference to (dbaccess::ODatabaseDocument *) 0x2af5a4edc558) at ucb/source/ucp/tdoc/tdoc_docmgr.cxx:697
> #12 0x00002af5a325651e in tdoc_ucp::OfficeDocumentsManager::notifyEvent (this=0x2af5a24a1f18, Event=...) at ucb/source/ucp/tdoc/tdoc_docmgr.cxx:305
> #13 0x00002af594251195 in cppu::OInterfaceContainerHelper::NotifySingleListener<com::sun::star::document::XEventListener, com::sun::star::document::EventObject>::operator() (this=0x2af5a4c89b20, listener=uno::Reference to (tdoc_ucp::OfficeDocumentsManager *) 0x2af5a24a1f40) at include/cppuhelper/interfacecontainer.h:262
> #14 0x00002af59425023e in cppu::OInterfaceContainerHelper::forEach<com::sun::star::document::XEventListener, cppu::OInterfaceContainerHelper::NotifySingleListener<com::sun::star::document::XEventListener, com::sun::star::document::EventObject> > (this=0x2af5a24a36a0, func=...) at include/cppuhelper/interfacecontainer.h:276
> #15 0x00002af59424f4da in cppu::OInterfaceContainerHelper::notifyEach<com::sun::star::document::XEventListener, com::sun::star::document::EventObject> (this=0x2af5a24a36a0, NotificationMethod=&virtual com::sun::star::document::XEventListener::notifyEvent(com::sun::star::document::EventObject const&), Event=...) at include/cppuhelper/interfacecontainer.h:289
> #16 0x00002af59424d864 in (anonymous namespace)::SfxGlobalEvents_Impl::implts_notifyListener (this=0x2af5a24a3628, aEvent=...) at sfx2/source/notify/globalevents.cxx:505
> #17 0x00002af59424c543 in (anonymous namespace)::SfxGlobalEvents_Impl::documentEventOccured (this=0x2af5a24a3628, _Event=...) at sfx2/source/notify/globalevents.cxx:315
> #18 0x00002af59016a5a5 in cppu::OInterfaceContainerHelper::NotifySingleListener<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent>::operator() (this=0x2af5a4c89c90, listener=uno::Reference to ((anonymous namespace)::SfxGlobalEvents_Impl *) 0x2af5a24a3678) at include/cppuhelper/interfacecontainer.h:262
> #19 0x00002af59016a35e in cppu::OInterfaceContainerHelper::forEach<com::sun::star::document::XDocumentEventListener, cppu::OInterfaceContainerHelper::NotifySingleListener<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent> > (this=0x11c0378, func=...) at include/cppuhelper/interfacecontainer.h:276
> #20 0x00002af590169ed6 in cppu::OInterfaceContainerHelper::notifyEach<com::sun::star::document::XDocumentEventListener, com::sun::star::document::DocumentEvent> (this=0x11c0378, NotificationMethod=&virtual com::sun::star::document::XDocumentEventListener::documentEventOccured(com::sun::star::document::DocumentEvent const&), Event=...) at include/cppuhelper/interfacecontainer.h:289
> #21 0x00002af5901690ed in dbaccess::DocumentEventNotifier_Impl::impl_notifyEvent_nothrow (this=0x11c0330, _rEvent=...) at dbaccess/source/core/dataaccess/documenteventnotifier.cxx:200
> #22 0x00002af5901693fa in dbaccess::DocumentEventNotifier_Impl::processEvent (this=0x11c0330, _rEvent=...) at dbaccess/source/core/dataaccess/documenteventnotifier.cxx:231
> #23 0x00002af58cba5de9 in comphelper::AsyncEventNotifier::execute (this=0x128c4e0) at comphelper/source/misc/asyncnotification.cxx:221
> #24 0x00002af58bcfe9c4 in salhelper::Thread::run (this=0x128c4e0) at salhelper/source/thread.cxx:40
> #25 0x00002af58bcfed8d in osl::threadFunc (param=0x128c4f0) at include/osl/thread.hxx:187
> #26 0x00002af589e2e2e7 in osl_thread_start_Impl (pData=0x128db40) at sal/osl/unx/thread.c:236
> #27 0x00002af58ac91c53 in start_thread () from /lib64/libpthread.so.0
> #28 0x00002af58a9bedbd in clone () from /lib64/libc.so.6

and

> Thread 1 (Thread 0x2af589931980 (LWP 7598)):
> #0  0x00002af58ac95565 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
> #1  0x00002af589e67146 in osl_waitCondition (Condition=0x11a22a0, pTimeout=0x0) at sal/osl/unx/conditn.cxx:275
> #2  0x00002af59e9c0866 in osl::Condition::wait (this=0x2af5a24060d0, pTimeout=0x0) at include/osl/conditn.hxx:82
> #3  0x00002af59e9c0bf5 in framework::Gate::wait (this=0x2af5a24060c0, pTimeOut=0x0) at framework/inc/threadhelp/gate.hxx:197
> #4  0x00002af59e9c0041 in framework::TransactionManager::setWorkingMode (this=0x2af5a24060b0, eMode=framework::E_BEFORECLOSE) at framework/source/fwi/threadhelp/transactionmanager.cxx:119
> #5  0x00002af59cb56c8f in (anonymous namespace)::Frame::dispose (this=0x2af5a2406010) at framework/source/services/frame.cxx:2229
> #6  0x00002af59cb55bec in (anonymous namespace)::Frame::close (this=0x2af5a2406010, bDeliverOwnership=0 '\000') at framework/source/services/frame.cxx:2002
> #7  0x00002af59010f9cc in dbaccess::ODatabaseDocument::impl_closeControllerFrames_nolck_throw (this=0x2af5a4edc538, _bDeliverOwnership=0 '\000') at dbaccess/source/core/dataaccess/databasedocument.cxx:1441
> #8  0x00002af59010fe24 in dbaccess::ODatabaseDocument::close (this=0x2af5a4edc538, _bDeliverOwnership=0 '\000') at dbaccess/source/core/dataaccess/databasedocument.cxx:1498
> #9  0x00002af58f6c59c6 in DialogSaveTest::test (this=0x922c10) at dbaccess/qa/extras/dialog-save.cxx:104
> #10 0x00002af58f6cc8d4 in CppUnit::TestCaller<DialogSaveTest>::runTest (this=0x879cc0) at workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:166
> #11 0x00002af589bb41b4 in CppUnit::TestCaseMethodFunctor::operator() (this=0x7fff58142f30) at TestCase.cpp:32
> #12 0x00002af58c8ab9e3 in (anonymous namespace)::Prot::protect (this=0x879da0, functor=...) at unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:88
> #13 0x00002af589bac2ef in CppUnit::ProtectorChain::ProtectFunctor::operator() (this=0x922aa0) at ProtectorChain.cpp:20
> #14 0x00002af58b4b5536 in (anonymous namespace)::Prot::protect (this=0x879dc0, functor=..., context=...) at unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:64
> #15 0x00002af589bac2ef in CppUnit::ProtectorChain::ProtectFunctor::operator() (this=0x922ca0) at ProtectorChain.cpp:20
> #16 0x00002af589b9dc64 in CppUnit::DefaultProtector::protect (this=0x8756a0, functor=..., context=...) at DefaultProtector.cpp:15
> #17 0x00002af589bac2ef in CppUnit::ProtectorChain::ProtectFunctor::operator() (this=0x922c70) at ProtectorChain.cpp:20
> #18 0x00002af589bac184 in CppUnit::ProtectorChain::protect (this=0x8753c0, functor=..., context=...) at ProtectorChain.cpp:77
> #19 0x00002af589bc339a in CppUnit::TestResult::protect (this=0x7fff58143450, functor=..., test=0x879cc0, shortDescription="") at TestResult.cpp:181
> #20 0x00002af589bb3c84 in CppUnit::TestCase::run (this=0x879cc0, result=0x7fff58143450) at TestCase.cpp:92
> #21 0x00002af589bb4a20 in CppUnit::TestComposite::doRunChildTests (this=0x922b50, controller=0x7fff58143450) at TestComposite.cpp:64
> #22 0x00002af589bb48aa in CppUnit::TestComposite::run (this=0x922b50, result=0x7fff58143450) at TestComposite.cpp:23
> #23 0x00002af589bb4a20 in CppUnit::TestComposite::doRunChildTests (this=0x922ad0, controller=0x7fff58143450) at TestComposite.cpp:64
> #24 0x00002af589bb48aa in CppUnit::TestComposite::run (this=0x922ad0, result=0x7fff58143450) at TestComposite.cpp:23
> #25 0x00002af589bca586 in CppUnit::TestRunner::WrappingSuite::run (this=0x879d30, result=0x7fff58143450) at TestRunner.cpp:47
> #26 0x00002af589bc30a4 in CppUnit::TestResult::runTest (this=0x7fff58143450, test=0x879d30) at TestResult.cpp:148
> #27 0x00002af589bca7e4 in CppUnit::TestRunner::run (this=0x7fff581432e0, controller=..., testPath="") at TestRunner.cpp:96
> #28 0x0000000000403ecf in (anonymous namespace)::ProtectedFixtureFunctor::run (this=0x7fff581433a0) at sal/cppunittester/cppunittester.cxx:150
> #29 0x0000000000404561 in sal_main () at sal/cppunittester/cppunittester.cxx:242
> #30 0x00000000004041a9 in main (argc=18, argv=0x7fff581436a8) at sal/cppunittester/cppunittester.cxx:166

and indeed UnoApiTest::setUp -> test::BootstrapFixture::setUp -> test_init_impl
-> InitVCL -> CreateSalInstance -> SalGenericInstance::AcquireYieldMutex causes
all such UnoApiTests to be run with the SolarMutex locked.

This reverts acdfb259 "dbaccess: disable hanging
close() for now."

Change-Id: Ifac49da2c55b0b27b780a348074f69de86967aa1
üst 70ba8971
......@@ -61,6 +61,12 @@ DialogSaveTest::DialogSaveTest()
void DialogSaveTest::test()
{
// UnoApiTest::setUp (via InitVCL) puts each test under a locked SolarMutex,
// but at least the below xDocCloseable->close call could lead to a deadlock
// then, and it looks like none of the code here requires the SolarMutex to
// be locked anyway:
SolarMutexReleaser rel;
OUString aFileName;
aFileName = getURLFromWorkdir("CppunitTest/testDialogSave.odb");
{
......@@ -101,7 +107,7 @@ void DialogSaveTest::test()
// close
uno::Reference< util::XCloseable > xDocCloseable(xComponent, UNO_QUERY_THROW);
CPPUNIT_ASSERT(xDocCloseable.is());
//xDocCloseable->close(false);
xDocCloseable->close(false);
// All our uno::References are (should?) be invalid now -> let them go out of scope
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment