• Stephan Bergmann's avatar
    Avoid deadlock between sd::ToolBarManager::Implementation::maMutex... · 5b0c551b
    Stephan Bergmann yazdı
    ...and SolarMutex, when e.g. during JunitTest_framework_complex the main thread
    has the SolarMutex locked and tries to lock
    
    > osl_acquireMutex(oslMutexImpl*)
    > osl::Mutex::acquire()
    > osl::Guard<osl::Mutex>::Guard(osl::Mutex&)
    > sd::ToolBarManager::Implementation::LockUpdate()
    > sd::ToolBarManager::LockUpdate()
    > sd::ToolBarManager::UpdateLock::UpdateLock(std::shared_ptr<sd::ToolBarManager> const&)
    > sd::framework::ToolBarModule::HandleUpdateStart()
    > sd::framework::ToolBarModule::notifyConfigurationChange(com::sun::star::drawing::framework::ConfigurationChangeEvent const&)
    > sd::framework::ConfigurationControllerBroadcaster::NotifyListeners(std::__debug::vector<sd::framework::ConfigurationControllerBroadcaster::ListenerDescriptor, std::allocator<sd::framework::ConfigurationControllerBroadcaster::ListenerDescriptor> > const&, com::sun::star::drawing::framework::ConfigurationChangeEvent const&)
    > sd::framework::ConfigurationControllerBroadcaster::NotifyListeners(com::sun::star::drawing::framework::ConfigurationChangeEvent const&)
    > sd::framework::ConfigurationUpdater::UpdateConfiguration()
    > sd::framework::ConfigurationUpdater::RequestUpdate(com::sun::star::uno::Reference<com::sun::star::drawing::framework::XConfiguration> const&)
    > sd::framework::ChangeRequestQueueProcessor::ProcessOneEvent()
    > sd::framework::ChangeRequestQueueProcessor::ProcessEvent(void*)
    > sd::framework::ChangeRequestQueueProcessor::LinkStubProcessEvent(void*, void*)
    > Link<void*, void>::Call(void*)
    > ImplHandleUserEvent(ImplSVEvent*)
    > ImplWindowFrameProc(vcl::Window*, unsigned short, void const*)
    > SalFrame::CallCallback(unsigned short, void const*)
    > SvpSalInstance::DoYield(bool, bool, unsigned long)
    > ImplYield(bool, bool, unsigned long)
    > Application::Yield()
    > Application::Execute()
    > desktop::Desktop::DoExecute()
    > desktop::Desktop::Main()
    > ImplSVMain()
    > SVMain()
    > soffice_main()
    > main()
    
    while some URP worker thread has sd::ToolBarManager::Implementation::maMutex
    locked and tries to lock
    
    > osl_acquireMutex(oslMutexImpl*)
    > osl::Mutex::acquire()
    > SalYieldMutex::acquire()
    > SolarMutexGuard::SolarMutexGuard()
    > framework::ToolbarLayoutManager::implts_calcWindowPosSizeOnSingleRowColumn(int, int, framework::ToolbarLayoutManager::SingleRowColumnWindowData&, Size const&)
    > framework::ToolbarLayoutManager::doLayout(Size const&)
    > framework::LayoutManager::implts_doLayout(bool, bool)
    > framework::LayoutManager::implts_doLayout_notify(bool)
    > framework::LayoutManager::unlock() (this=0x2b0d9ff633e8)
    > (anonymous namespace)::LayouterLock::~LayouterLock()
    > std::default_delete<(anonymous namespace)::LayouterLock>::operator()((anonymous namespace)::LayouterLock*) const
    > std::unique_ptr<(anonymous namespace)::LayouterLock, std::default_delete<(anonymous namespace)::LayouterLock> >::reset((anonymous namespace)::LayouterLock*)
    > sd::ToolBarManager::Implementation::Update(std::unique_ptr<(anonymous namespace)::LayouterLock, std::default_delete<(anonymous namespace)::LayouterLock> >)
    > sd::ToolBarManager::Implementation::UnlockUpdate()
    > sd::ToolBarManager::Implementation::UpdateLockImplementation::~UpdateLockImplementation()
    > sd::ToolBarManager::Implementation::SetValid(bool)
    > sd::ToolBarManager::Implementation::EventMultiplexerCallback(sd::tools::EventMultiplexerEvent&)
    > sd::ToolBarManager::Implementation::LinkStubEventMultiplexerCallback(void*, sd::tools::EventMultiplexerEvent&)
    > Link<sd::tools::EventMultiplexerEvent&, void>::Call(sd::tools::EventMultiplexerEvent&) const
    > sd::tools::EventMultiplexer::Implementation::CallListeners(sd::tools::EventMultiplexerEvent&)
    > sd::tools::EventMultiplexer::Implementation::CallListeners(unsigned int, void*)
    > sd::tools::EventMultiplexer::Implementation::frameAction(com::sun::star::frame::FrameActionEvent const&)
    > (anonymous namespace)::Frame::implts_sendFrameActionEvent(com::sun::star::frame::FrameAction const&)
    > (anonymous namespace)::Frame::setComponent(com::sun::star::uno::Reference<com::sun::star::awt::XWindow> const&, com::sun::star::uno::Reference<com::sun::star::frame::XController> const&)
    > (anonymous namespace)::Frame::close(unsigned char)
    > gcc3::callVirtualMethod(void*, unsigned int, void*, _typelib_TypeDescriptionReference*, bool, unsigned long*, unsigned int, unsigned long*, double*)
    > cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy*, bridges::cpp_uno::shared::VtableSlot, _typelib_TypeDescriptionReference*, int, _typelib_MethodParameter*, void*, void**, _uno_Any**)
    > bridges::cpp_uno::shared::unoInterfaceProxyDispatch(_uno_Interface*, _typelib_TypeDescription const*, void*, void**, _uno_Any**)
    > binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*, std::__debug::vector<binaryurp::BinaryAny, std::allocator<binaryurp::BinaryAny> >*) const
    > binaryurp::IncomingRequest::execute() const
    > request(void*)
    > cppu_threadpool::JobQueue::enter(long, bool)
    > cppu_threadpool::ORequestThread::run()
    > threadFunc(void*) (param=0x2b0db00019e0)
    > osl_thread_start_Impl(void*)
    > start_thread
    
    Change-Id: Ie846bd95944680160eebc93b904875142723ac70
    5b0c551b
ToolBarManager.cxx 46.1 KB