Call ~Idle with SolarMutex locked

...may be the cause for rather frequent UITest failures on Jenkins bot
lo_tb_master_linux_dbg, like
<https://ci.libreoffice.org/job/lo_tb_master_linux_dbg/14067/console> during
UITest_calc_demo:

> Thread 1 (Thread 0x2b2622036700 (LWP 12315)):
> #0  0x00002b2604d495eb in Task::~Task() (this=0x2b2622034f90, __in_chrg=<optimized out>) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/vcl/source/app/scheduler.cxx:362
> #1  0x00002b2604d7cddc in Timer::~Timer() (this=0x2b2622034f90, __in_chrg=<optimized out>) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/vcl/source/app/timer.cxx:73
> #2  0x00002b26047eb25a in Idle::~Idle() (this=0x2b2622034f90, __in_chrg=<optimized out>) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/include/vcl/idle.hxx:30
> #3  0x00002b2604e900fd in UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::uno::Sequence<com::sun:🫘:PropertyValue> const&) (this=0x304ce50, rAction="TYPE", rPropValues=uno::Sequence of length 1 = {...}) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/vcl/source/uitest/uno/uiobject_uno.cxx:118
>         aIdle = {<Timer> = {<Task> = {_vptr.Task = 0x2b2605888c10 <vtable for Task+16>, mpSchedulerData = 0x0, mpDebugName = 0x2b2605264160 "UI Test Idle Handler", mePriority = HIGH, mbActive = false}, maInvokeHandler = {function_ = 0x2b2604e8fa66 <(anonymous namespace)::ExecuteWrapper::LinkStubExecuteActionHdl(void*, Timer*)>, instance_ = 0x2de91c0}, mnTimeout = 1, mbAuto = false}, <No data fields>}
>         func = {<std::_Maybe_unary_or_binary_function<void>> = {<No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x27aafc0, _M_const_object = 0x27aafc0, _M_function_pointer = 0x27aafc0, _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x27aafc0, this adjustment 38138176}, _M_pod_data = "\300\257z\002\000\000\000\000@\361E\002\000\000\000"}, _M_manager = 0x2b2604e90ac7 <std::_Function_base::_Base_manager<UIObjectUnoObj::executeAction(const rtl::OUString&, const com::sun::uno::Sequence<com::sun:🫘:PropertyValue>&)::__lambda0>::_M_manager(std::_Any_data &, const std::_Any_data &, std::_Manager_operation)>}, _M_invoker = 0x2b2604e90aa5 <std::_Function_handler<void(), UIObjectUnoObj::executeAction(const rtl::OUString&, const com::sun::uno::Sequence<com::sun:🫘:PropertyValue>&)::__lambda0>::_M_invoke(const std::_Any_data &)>}
>         lk = {_M_device = 0x304cef0, _M_owns = true}
>         pWrapper = 0x2de91c0
> #4  0x00002b261d76951d in gcc3::callVirtualMethod(void*, unsigned int, void*, _typelib_TypeDescriptionReference*, bool, unsigned long*, unsigned int, unsigned long*, double*) (pThis=0x304cea0, nVtableIndex=4, pRegisterReturn=0x0, pReturnTypeRef=0x16b42c0, bSimpleReturn=true, pStack=0x2b2622035160, nStack=0, pGPR=0x2b26220352d0, pFPR=0x2b2622035300) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.cxx:133
>         data = {pMethod = 47442291130818, pStack = 0x2b2622035160, nStack = 0, pGPR = 0x2b26220352d0, pFPR = 0x2b2622035300, rax = 47442779394304, rdx = 47442779394256, xmm0 = 2.3439542265158875e-310, xmm1 = 2.343984744210869e-310}
>         pMethod = 47442301612736
> #5  0x00002b261d76815c in cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy*, bridges::cpp_uno::shared::VtableSlot, typelib_TypeDescriptionReference*, sal_Int32, typelib_MethodParameter*, void*, void**, uno_Any**) (pThis=0x27ade30, aVtableSlot=..., pReturnTypeRef=0x16b42c0, nParams=2, pParams=0x27b0850, pUnoReturn=0x0, pUnoArgs=0x2eecbc0, ppUnoExc=0x2b2622035488) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:237
>         pStack = 0x2b2622035160
>         pFPR = {2.3439847442227266e-310, 2.3439819402763736e-310, 8.4879831638610893e-314, 2.3439847442246535e-310, 2.0565652466724057e-316, -2.1644405065794623e-51, 2.3439847442250981e-310, 0}
>         __PRETTY_FUNCTION__ = "void cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy*, bridges::cpp_uno::shared::VtableSlot, typelib_TypeDescriptionReference*, sal_Int32, typelib_MethodParameter*, void*, void**, uno_Any**)"
>         pCppArgs = 0x2b2622035120
>         pStackStart = 0x2b2622035160
>         pGPR = {50646688, 41629936, 47442779394304, 47442703110834, 0, 41625344}
>         nTempIndices = 1
>         nFPR = 0
>         pAdjustedThisPtr = 0x304cea0
>         ppTempParamTypeDescr = 0x2b2622035140
>         nGPR = 3
>         pReturnTypeDescr = 0x16b42c0
>         pCppReturn = 0x0
>         bSimpleReturn = true
>         pTempIndices = 0x2b2622035130
> #6  0x00002b261d768bdb in bridges::cpp_uno::shared::unoInterfaceProxyDispatch(_uno_Interface*, _typelib_TypeDescription const*, void*, void**, _uno_Any**) (pUnoI=0x27ade30, pMemberDescr=0x27b2700, pReturn=0x0, pArgs=0x2eecbc0, ppException=0x2b2622035488) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:425
>         nMemberPos = 4
>         aVtableSlot = {offset = 0, index = 4}
>         pThis = 0x27ade30
>         pTypeDescr = 0x27aeab0
>         __PRETTY_FUNCTION__ = "void bridges::cpp_uno::shared::unoInterfaceProxyDispatch(uno_Interface*, const typelib_TypeDescription*, void*, void**, uno_Any**)"
> #7  0x00002b261ea0ff28 in binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*, std::__debug::vector<binaryurp::BinaryAny, std::allocator<binaryurp::BinaryAny> >*) const (this=0x17eaec0, returnValue=0x2b26220358a0, outArguments=0x2b2622035920) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/binaryurp/source/incomingrequest.cxx:242
>         exc = <error reading variable: Cannot access memory at address 0x7261686320747376>
>         pexc = 0x2b26220354b0
>         retType = {_pTypeDescr = 0x16b42c0}
>         nSize = 0
>         retBuf = std::__debug::vector of length 0, capacity 0
>         outBufs = empty std::__debug::list
>         args = std::__debug::vector of length 2, capacity 2 = {0x27b38f0, 0x27b3908}
>         __PRETTY_FUNCTION__ = "bool binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*, std::__debug::vector<binaryurp::BinaryAny>*) const"
>         isExc = false
> #8  0x00002b261ea0ed16 in binaryurp::IncomingRequest::execute() const (this=0x17eaec0) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/binaryurp/source/incomingrequest.cxx:79
>         resetCc = true
>         oldCc = {m_pUnoI = 0x0}
>         ret = {data_ = _uno_Any(void)}
>         outArgs = std::__debug::vector of length 0, capacity 0
>         isExc = false
> #9  0x00002b261ea2f7a4 in binaryurp::(anonymous namespace)::request(void*) (pThreadSpecificData=0x17eaec0) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/binaryurp/source/reader.cxx:85
>         __PRETTY_FUNCTION__ = "void binaryurp::{anonymous}::request(void*)"
> #10 0x00002b25fd2edf5f in cppu_threadpool::JobQueue::enter(long, bool) (this=0x2d036e0, nDisposeId=41587312, bReturnWhenNoJob=true) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/cppu/source/threadpool/jobqueue.cxx:107
>         guard = {pT = 0x2d036e0}
>         job = {pThreadSpecificData = 0x17eaec0, doRequest = 0x2b261ea2f73b <binaryurp::(anonymous namespace)::request(void*)>}
>         pReturn = 0x0
> #11 0x00002b25fd2f2bfd in cppu_threadpool::ORequestThread::run() (this=0x27a9270) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/cppu/source/threadpool/thread.cxx:172
> #12 0x00002b25fd2f312b in osl::threadFunc(void*) (param=0x27a9280) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/include/osl/thread.hxx:185
>         pObj = 0x27a9280
> #13 0x00002b25f9a194a5 in osl_thread_start_Impl(void*) (pData=0x27a9540) at /home/tdf/lode/jenkins/workspace/lo_tb_master_linux_dbg/sal/osl/unx/thread.cxx:237
>         terminate = false
>         pImpl = 0x27a9540
>         __PRETTY_FUNCTION__ = "void* osl_thread_start_Impl(void*)"
> #14 0x00002b25fa404dc5 in start_thread () at /lib64/libpthread.so.0
> #15 0x00002b25fa131ced in clone () at /lib64/libc.so.6

Change-Id: Iad8402ce9fd3315b7446d6274a4fe18f8e8012fd
This commit is contained in:
Stephan Bergmann
2017-06-28 16:12:05 +02:00
parent ea7df4a802
commit 4cfcc3de24

View File

@@ -10,6 +10,7 @@
#include <memory>
#include "uiobject_uno.hxx"
#include <utility>
#include <o3tl/make_unique.hxx>
#include <vcl/svapp.hxx>
#include <vcl/idle.hxx>
@@ -115,9 +116,9 @@ void SAL_CALL UIObjectUnoObj::executeAction(const OUString& rAction, const css::
mAction = rAction;
mPropValues = rPropValues;
mReady = false;
Idle aIdle;
aIdle.SetDebugName("UI Test Idle Handler");
aIdle.SetPriority(TaskPriority::HIGH);
auto aIdle = o3tl::make_unique<Idle>();
aIdle->SetDebugName("UI Test Idle Handler");
aIdle->SetPriority(TaskPriority::HIGH);
std::function<void()> func = [this](){
@@ -136,14 +137,17 @@ void SAL_CALL UIObjectUnoObj::executeAction(const OUString& rAction, const css::
ExecuteWrapper* pWrapper = new ExecuteWrapper(func, LINK(this, UIObjectUnoObj, NotifyHdl));
std::unique_lock<std::mutex>(pWrapper->getMutex());
aIdle.SetInvokeHandler(LINK(pWrapper, ExecuteWrapper, ExecuteActionHdl));
aIdle->SetInvokeHandler(LINK(pWrapper, ExecuteWrapper, ExecuteActionHdl));
{
SolarMutexGuard aGuard;
aIdle.Start();
aIdle->Start();
}
cv.wait(lk, [this]{return mReady;});
pWrapper->setSignal();
SolarMutexGuard aGuard;
aIdle.reset();
}
css::uno::Sequence<css::beans::PropertyValue> UIObjectUnoObj::getState()