From f9ff22db058180d161b32f5dcd87e72cfa3b6889 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Mon, 9 Sep 2024 10:50:07 +0200 Subject: [PATCH] tsan:lock-order-inversion in forms ================== WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=14614) Cycle in lock order graph: M0 (0x720c004ac190) => M1 (0x720c004a8200) => M0 Mutex M1 acquired here while holding mutex M0 in thread T43: 2 osl::Mutex::acquire() /home/noel/libo-tsan/include/osl/mutex.hxx:63 (libuno_cppuhelpergcc3.so.3+0x8fdd9) 3 osl::Guard::Guard(osl::Mutex&) /home/noel/libo-tsan/include/osl/mutex.hxx:144 (libuno_cppuhelpergcc3.so.3+0x8fdd9) 4 cppu::OBroadcastHelperVar::addListener(com::sun::star::uno::Type const&, com::sun::star::uno::Reference const&) /home/noel/libo-tsan/include/cppuhelper/interfacecontainer.h:468 (libuno_cppuhelpergcc3.so.3+0x8fdd9) 5 cppu::OPropertySetHelper::addPropertiesChangeListener(com::sun::star::uno::Sequence const&, com::sun::star::uno::Reference const&) /home/noel/libo-tsan/cppuhelper/source/propshlp.cxx:912 (libuno_cppuhelpergcc3.so.3+0x8fdd9) 6 comphelper::OPropertySetAggregationHelper::addPropertiesChangeListener(com::sun::star::uno::Sequence const&, com::sun::star::uno::Reference const&) /home/noel/libo-tsan/comphelper/source/property/propagg.cxx:495 (libcomphelper.so+0x1a1865) 7 comphelper::OPropertySetAggregationHelper::startListening() /home/noel/libo-tsan/comphelper/source/property/propagg.cxx:466 (libcomphelper.so+0x1a1416) ^^^ Mutex M0 previously acquired by the same thread here: 8 comphelper::OPropertySetAggregationHelper::addPropertyChangeListener(rtl::OUString const&, com::sun::star::uno::Reference const&) /home/noel/libo-tsan/comphelper/source/property/propagg.cxx:488 (libcomphelper.so+0x1a181a) 9 non-virtual thunk to comphelper::OPropertySetAggregationHelper::addPropertyChangeListener(rtl::OUString const&, com::sun::star::uno::Reference const&) /home/noel/libo-tsan/comphelper/source/property/propagg.cxx:? (libcomphelper.so+0x1a181a) 10 frm::OInterfaceContainer::implInsert(int, com::sun::star::uno::Reference const&, bool, frm::ElementDescription*, bool) /home/noel/libo-tsan/forms/source/misc/InterfaceContainer.cxx:787 (libfrmlo.so+0x23e03c) 11 frm::OInterfaceContainer::insertByIndex(int, com::sun::star::uno::Any const&) /home/noel/libo-tsan/forms/source/misc/InterfaceContainer.cxx:904 (libfrmlo.so+0x240644) 12 non-virtual thunk to frm::OInterfaceContainer::insertByIndex(int, com::sun::star::uno::Any const&) /home/noel/libo-tsan/forms/source/misc/InterfaceContainer.cxx:? (libfrmlo.so+0x240716) 13 FmXUndoEnvironment::Inserted(FmFormObj*) /home/noel/libo-tsan/svx/source/form/fmundo.cxx:424 (libsvxcorelo.so+0x41b2a4) 14 FmXUndoEnvironment::Inserted(SdrObject*) /home/noel/libo-tsan/svx/source/form/fmundo.cxx:336 (libsvxcorelo.so+0x41a982) 15 FmXUndoEnvironment::Notify(SfxBroadcaster&, SfxHint const&) /home/noel/libo-tsan/svx/source/form/fmundo.cxx:292 (libsvxcorelo.so+0x41a8a0) 16 non-virtual thunk to FmXUndoEnvironment::Notify(SfxBroadcaster&, SfxHint const&) /home/noel/libo-tsan/svx/source/form/fmundo.cxx:? (libsvxcorelo.so+0x41acd2) 17 SfxBroadcaster::Broadcast(SfxHint const&) /home/noel/libo-tsan/svl/source/notify/SfxBroadcaster.cxx:40 (libsvllo.so+0xe7c3d) 18 SdrObjList::InsertObject(SdrObject*, unsigned long) /home/noel/libo-tsan/svx/source/svdraw/svdpage.cxx:351 (libsvxcorelo.so+0x6fdf3a) 19 FmFormPage::InsertObject(SdrObject*, unsigned long) /home/noel/libo-tsan/svx/source/form/fmpage.cxx:79 (libsvxcorelo.so+0x3c1e05) 20 SvxDrawPage::add(com::sun::star::uno::Reference const&) /home/noel/libo-tsan/svx/source/unodraw/unopage.cxx:191 (libsvxcorelo.so+0x850c7b) 21 SwFmDrawPage::add(com::sun::star::uno::Reference const&) /home/noel/libo-tsan/sw/source/core/unocore/unodraw.cxx:649 (libswlo.so+0xc30712) 22 non-virtual thunk to SwFmDrawPage::add(com::sun::star::uno::Reference const&) /home/noel/libo-tsan/sw/source/core/unocore/unodraw.cxx:? (libswlo.so+0xc31732) 23 gcc3::callVirtualMethod(void*, unsigned int, void*, _typelib_TypeDescriptionReference*, bool, unsigned long*, unsigned int, unsigned long*, double*) /home/noel/libo-tsan/bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.cxx:87 (libgcc3_uno.so+0xd92a) 24 cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy*, bridges::cpp_uno::shared::VtableSlot, _typelib_TypeDescriptionReference*, int, _typelib_MethodParameter*, void*, void**, _uno_Any**) /home/noel/libo-tsan/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:229 (libgcc3_uno.so+0xcc3c) 25 unoInterfaceProxyDispatch /home/noel/libo-tsan/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx:409 (libgcc3_uno.so+0xc1f6) Mutex M0 acquired here while holding mutex M1 in thread T44: 3 osl::Guard::Guard(osl::Mutex&) /home/noel/libo-tsan/include/osl/mutex.hxx:144 (libcomphelper.so+0x1bde34) 4 comphelper::OPropertyChangeListener::setAdapter(comphelper::OPropertyChangeMultiplexer*) /home/noel/libo-tsan/comphelper/source/property/propmultiplex.cxx:58 (libcomphelper.so+0x1bde34) 5 comphelper::OPropertyChangeMultiplexer::disposing(com::sun::star::lang::EventObject const&) /home/noel/libo-tsan/comphelper/source/property/propmultiplex.cxx:120 (libcomphelper.so+0x1bde34) 6 non-virtual thunk to comphelper::OPropertyChangeMultiplexer::disposing(com::sun::star::lang::EventObject const&) /home/noel/libo-tsan/comphelper/source/property/propmultiplex.cxx:? (libcomphelper.so+0x1bdf12) 7 cppu::OInterfaceContainerHelper::disposeAndClear(com::sun::star::lang::EventObject const&) /home/noel/libo-tsan/cppuhelper/source/interfacecontainer.cxx:272 (libuno_cppuhelpergcc3.so.3+0x66524) 8 cppu::OMultiTypeInterfaceContainerHelperInt32::disposeAndClear(com::sun::star::lang::EventObject const&) /home/noel/libo-tsan/cppuhelper/source/interfacecontainer.cxx:577 (libuno_cppuhelpergcc3.so.3+0x68af0) 9 cppu::OPropertySetHelper::disposing() /home/noel/libo-tsan/cppuhelper/source/propshlp.cxx:246 (libuno_cppuhelpergcc3.so.3+0x8be45) 10 comphelper::OPropertySetAggregationHelper::disposing() /home/noel/libo-tsan/comphelper/source/property/propagg.cxx:366 (libcomphelper.so+0x1a0321) ^^^ Mutex M1 previously acquired by the same thread here: 11 frm::OControlModel::disposing() /home/noel/libo-tsan/forms/source/component/FormComponent.cxx:705 (libfrmlo.so+0x19eecc) 12 frm::ORichTextModel::disposing() /home/noel/libo-tsan/forms/source/richtext/richtextmodel.cxx:295 (libfrmlo.so+0x267bdb) 13 cppu::OComponentHelper::dispose() /home/noel/libo-tsan/cppuhelper/source/component.cxx:159 (libuno_cppuhelpergcc3.so.3+0x4504f) 14 non-virtual thunk to cppu::OComponentHelper::dispose() /home/noel/libo-tsan/cppuhelper/source/component.cxx:? (libuno_cppuhelpergcc3.so.3+0x45379) 15 frm::OControlModel::disposing() /home/noel/libo-tsan/forms/source/component/FormComponent.cxx:708 (libfrmlo.so+0x19ef13) 16 frm::OBoundControlModel::disposing() /home/noel/libo-tsan/forms/source/component/FormComponent.cxx:1340 (libfrmlo.so+0x1a507f) 17 frm::OEditModel::disposing() /home/noel/libo-tsan/forms/source/component/Edit.cxx:301 (libfrmlo.so+0x161208) 18 cppu::OComponentHelper::dispose() /home/noel/libo-tsan/cppuhelper/source/component.cxx:159 (libuno_cppuhelpergcc3.so.3+0x4504f) 19 non-virtual thunk to cppu::OComponentHelper::dispose() /home/noel/libo-tsan/cppuhelper/source/component.cxx:? (libuno_cppuhelpergcc3.so.3+0x45379) 20 SdrUnoObj::~SdrUnoObj() /home/noel/libo-tsan/svx/source/svdraw/svdouno.cxx:214 (libsvxcorelo.so+0x6f471b) 21 FmFormObj::~FmFormObj() /home/noel/libo-tsan/svx/source/form/fmobj.cxx:119 (libsvxcorelo.so+0x3bd8cf) 22 FmFormObj::~FmFormObj() /home/noel/libo-tsan/svx/source/form/fmobj.cxx:112 (libsvxcorelo.so+0x3bd985) 23 SdrObject::release() /home/noel/libo-tsan/svx/source/svdraw/svdobj.cxx:486 (libsvxcorelo.so+0x6634df) 24 rtl::Reference::~Reference() /home/noel/libo-tsan/include/rtl/ref.hxx:126 (libsvxcorelo.so+0x61610d) 25 void std::destroy_at >(rtl::Reference*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:88 (libsvxcorelo.so+0x61610d) 26 void std::_Destroy >(rtl::Reference*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:149 (libsvxcorelo.so+0x61610d) 27 void std::_Destroy_aux::__destroy*>(rtl::Reference*, rtl::Reference*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:163 (libsvxcorelo.so+0x61610d) 28 void std::_Destroy*>(rtl::Reference*, rtl::Reference*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:195 (libsvxcorelo.so+0x61610d) 29 void std::_Destroy*, rtl::Reference >(rtl::Reference*, rtl::Reference*, std::allocator >&) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/alloc_traits.h:948 (libsvxcorelo.so+0x61610d) 30 std::vector, std::allocator > >::~vector() /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_vector.h:735 (libsvxcorelo.so+0x61610d) 31 SdrModel::ClearModel(bool) /home/noel/libo-tsan/svx/source/svdraw/svdmodel.cxx:623 (libsvxcorelo.so+0x61610d) 32 SwDrawModel::~SwDrawModel() /home/noel/libo-tsan/sw/source/core/draw/drawdoc.cxx:108 (libswlo.so+0x714650) 33 std::default_delete::operator()(SwDrawModel*) const /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:99 (libswlo.so+0x5a3082) 34 std::__uniq_ptr_impl >::reset(SwDrawModel*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:211 (libswlo.so+0x5a3082) 35 std::unique_ptr >::reset(SwDrawModel*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/unique_ptr.h:509 (libswlo.so+0x5a3082) 36 sw::DocumentDrawModelManager::ReleaseDrawModel() /home/noel/libo-tsan/sw/source/core/doc/DocumentDrawModelManager.cxx:162 (libswlo.so+0x5a3082) 37 SwDoc::~SwDoc() /home/noel/libo-tsan/sw/source/core/doc/docnew.cxx:585 (libswlo.so+0x5457c8) 38 SwDoc::release() /home/noel/libo-tsan/sw/source/core/doc/doc.cxx:129 (libswlo.so+0x4b8993) 39 rtl::Reference::clear() /home/noel/libo-tsan/include/rtl/ref.hxx:193 (libswlo.so+0x104c301) 40 SwDocShell::RemoveLink() /home/noel/libo-tsan/sw/source/uibase/app/docshini.cxx:444 (libswlo.so+0x104c301) 41 SwDocShell::~SwDocShell() /home/noel/libo-tsan/sw/source/uibase/app/docshini.cxx:372 (libswlo.so+0x104bf36) 42 SwDocShell::~SwDocShell() /home/noel/libo-tsan/sw/source/uibase/app/docshini.cxx:362 (libswlo.so+0x104c469) 43 non-virtual thunk to SwDocShell::~SwDocShell() /home/noel/libo-tsan/sw/source/uibase/app/docshini.cxx:? (libswlo.so+0x104c469) 44 cppu::OWeakObject::release() /home/noel/libo-tsan/cppuhelper/source/weak.cxx:230 (libuno_cppuhelpergcc3.so.3+0x105ae7) 45 rtl::Reference::~Reference() /home/noel/libo-tsan/include/rtl/ref.hxx:126 (libsfxlo.so+0x5209e5) 46 IMPL_SfxBaseModel_DataContainer::~IMPL_SfxBaseModel_DataContainer() /home/noel/libo-tsan/sfx2/source/doc/sfxbasemodel.cxx:265 (libsfxlo.so+0x5209e5) 47 void std::destroy_at(IMPL_SfxBaseModel_DataContainer*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:88 (libsfxlo.so+0x51f4e6) 48 void std::_Destroy(IMPL_SfxBaseModel_DataContainer*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:149 (libsfxlo.so+0x51f4e6) 49 void std::allocator_traits >::destroy(std::allocator&, IMPL_SfxBaseModel_DataContainer*) /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/alloc_traits.h:675 (libsfxlo.so+0x51f4e6) 50 std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2>::_M_dispose() /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr_base.h:613 (libsfxlo.so+0x51f4e6) 51 SfxBaseModel::dispose() /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/shared_ptr_base.h:175 (libsfxlo.so+0x4e7c7c) 52 SwXTextDocument::dispose() /home/noel/libo-tsan/sw/source/uibase/uno/unotxdoc.cxx:562 (libswlo.so+0x13896e1) 53 SfxBaseModel::close(unsigned char) /home/noel/libo-tsan/sfx2/source/doc/sfxbasemodel.cxx:1526 (libsfxlo.so+0x4eed16) 54 SwXTextDocument::close(unsigned char) /home/noel/libo-tsan/sw/source/uibase/uno/unotxdoc.cxx:575 (libswlo.so+0x138999c) 55 non-virtual thunk to SwXTextDocument::close(unsigned char) /home/noel/libo-tsan/sw/source/uibase/uno/unotxdoc.cxx:? (libswlo.so+0x1389ad3) 56 gcc3::callVirtualMethod(void*, unsigned int, void*, _typelib_TypeDescriptionReference*, bool, unsigned long*, unsigned int, unsigned long*, double*) /home/noel/libo-tsan/bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.cxx:87 (libgcc3_uno.so+0xd92a) Change-Id: Ie16fc0ff7462632a591a46025a38344006d43c30 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173068 Tested-by: Jenkins Reviewed-by: Noel Grandin --- comphelper/source/property/propmultiplex.cxx | 20 ++++++++++++++----- .../source/propctrlr/submissionhandler.cxx | 2 +- forms/source/component/DatabaseForm.cxx | 4 ++-- forms/source/component/FormComponent.cxx | 4 ++-- forms/source/component/clickableimage.cxx | 4 ++-- include/comphelper/propmultiplex.hxx | 8 +++++--- reportdesign/source/ui/dlg/AddField.cxx | 2 +- reportdesign/source/ui/dlg/GroupsSorting.cxx | 2 +- reportdesign/source/ui/dlg/Navigator.cxx | 4 ++-- .../source/ui/report/ReportSection.cxx | 2 +- .../source/ui/report/ReportWindow.cxx | 2 +- .../source/ui/report/ScrollHelper.cxx | 2 +- .../source/ui/report/SectionWindow.cxx | 2 +- svx/source/fmcomp/gridcell.cxx | 2 +- svx/source/fmcomp/gridctrl.cxx | 4 ++-- 15 files changed, 38 insertions(+), 26 deletions(-) diff --git a/comphelper/source/property/propmultiplex.cxx b/comphelper/source/property/propmultiplex.cxx index 66a1545f852e..e8470d8a3848 100644 --- a/comphelper/source/property/propmultiplex.cxx +++ b/comphelper/source/property/propmultiplex.cxx @@ -32,8 +32,13 @@ using namespace ::com::sun::star::beans; OPropertyChangeListener::~OPropertyChangeListener() { - if (m_xAdapter.is()) - m_xAdapter->dispose(); + rtl::Reference xTmpAdapter; + { + std::unique_lock aGuard(m_aAdapterMutex); + xTmpAdapter = std::move(m_xAdapter); + } + if ( xTmpAdapter.is() ) + xTmpAdapter->dispose(); } @@ -45,8 +50,13 @@ void OPropertyChangeListener::_disposing(const EventObject&) void OPropertyChangeListener::disposeAdapter() { - if ( m_xAdapter.is() ) - m_xAdapter->dispose(); + rtl::Reference xTmpAdapter; + { + std::unique_lock aGuard(m_aAdapterMutex); + xTmpAdapter = std::move(m_xAdapter); + } + if ( xTmpAdapter.is() ) + xTmpAdapter->dispose(); // will automatically set a new adapter OSL_ENSURE( !m_xAdapter.is(), "OPropertyChangeListener::disposeAdapter: what did dispose do?" ); @@ -55,7 +65,7 @@ void OPropertyChangeListener::disposeAdapter() void OPropertyChangeListener::setAdapter(OPropertyChangeMultiplexer* pAdapter) { - ::osl::MutexGuard aGuard(m_rMutex); + std::unique_lock aGuard(m_aAdapterMutex); m_xAdapter = pAdapter; } diff --git a/extensions/source/propctrlr/submissionhandler.cxx b/extensions/source/propctrlr/submissionhandler.cxx index 3abbbd3f6375..d7db39b973f8 100644 --- a/extensions/source/propctrlr/submissionhandler.cxx +++ b/extensions/source/propctrlr/submissionhandler.cxx @@ -82,7 +82,7 @@ namespace pcr SubmissionPropertyHandler::SubmissionPropertyHandler( const Reference< XComponentContext >& _rxContext ) :PropertyHandlerComponent( _rxContext ) - ,OPropertyChangeListener( m_aMutex ) + ,OPropertyChangeListener() { } diff --git a/forms/source/component/DatabaseForm.cxx b/forms/source/component/DatabaseForm.cxx index 9d121cdf654a..f32b95a4c482 100644 --- a/forms/source/component/DatabaseForm.cxx +++ b/forms/source/component/DatabaseForm.cxx @@ -226,7 +226,7 @@ Any SAL_CALL ODatabaseForm::queryAggregation(const Type& _rType) ODatabaseForm::ODatabaseForm(const Reference& _rxContext) :OFormComponents(_rxContext) ,OPropertySetAggregationHelper(OComponentHelper::rBHelper) - ,OPropertyChangeListener(m_aMutex) + ,OPropertyChangeListener() ,m_aLoadListeners(m_aMutex) ,m_aRowSetApproveListeners(m_aMutex) ,m_aSubmitListeners(m_aMutex) @@ -256,7 +256,7 @@ ODatabaseForm::ODatabaseForm(const Reference& _rxContext) ODatabaseForm::ODatabaseForm( const ODatabaseForm& _cloneSource ) :OFormComponents( _cloneSource ) ,OPropertySetAggregationHelper( OComponentHelper::rBHelper ) - ,OPropertyChangeListener( m_aMutex ) + ,OPropertyChangeListener() ,ODatabaseForm_BASE1() ,ODatabaseForm_BASE2() ,ODatabaseForm_BASE3() diff --git a/forms/source/component/FormComponent.cxx b/forms/source/component/FormComponent.cxx index 4e134a4fec55..1bedf96fb41a 100644 --- a/forms/source/component/FormComponent.cxx +++ b/forms/source/component/FormComponent.cxx @@ -1133,7 +1133,7 @@ OBoundControlModel::OBoundControlModel( const OUString& _rUnoControlModelTypeName, const OUString& _rDefault, const bool _bCommitable, const bool _bSupportExternalBinding, const bool _bSupportsValidation ) :OControlModel( _rxFactory, _rUnoControlModelTypeName, _rDefault, false ) - ,OPropertyChangeListener( m_aMutex ) + ,OPropertyChangeListener() ,m_nValuePropertyAggregateHandle( -1 ) ,m_nFieldType( DataType::OTHER ) ,m_bValuePropertyMayBeVoid( false ) @@ -1162,7 +1162,7 @@ OBoundControlModel::OBoundControlModel( OBoundControlModel::OBoundControlModel( const OBoundControlModel* _pOriginal, const Reference< XComponentContext>& _rxFactory ) :OControlModel( _pOriginal, _rxFactory, true, false ) - ,OPropertyChangeListener( m_aMutex ) + ,OPropertyChangeListener() ,m_nValuePropertyAggregateHandle( _pOriginal->m_nValuePropertyAggregateHandle ) ,m_nFieldType( DataType::OTHER ) ,m_bValuePropertyMayBeVoid( _pOriginal->m_bValuePropertyMayBeVoid ) diff --git a/forms/source/component/clickableimage.cxx b/forms/source/component/clickableimage.cxx index 53a2337ac429..8c16660c731d 100644 --- a/forms/source/component/clickableimage.cxx +++ b/forms/source/component/clickableimage.cxx @@ -441,7 +441,7 @@ namespace frm OClickableImageBaseModel::OClickableImageBaseModel( const Reference< XComponentContext >& _rxFactory, const OUString& _rUnoControlModelTypeName, const OUString& rDefault ) :OControlModel( _rxFactory, _rUnoControlModelTypeName, rDefault ) - ,OPropertyChangeListener(m_aMutex) + ,OPropertyChangeListener() ,m_bDispatchUrlInternal(false) ,m_bProdStarted(false) { @@ -452,7 +452,7 @@ namespace frm OClickableImageBaseModel::OClickableImageBaseModel( const OClickableImageBaseModel* _pOriginal, const Reference& _rxFactory ) :OControlModel( _pOriginal, _rxFactory ) - ,OPropertyChangeListener( m_aMutex ) + ,OPropertyChangeListener() ,m_xGraphicObject( _pOriginal->m_xGraphicObject ) ,m_bDispatchUrlInternal(false) ,m_bProdStarted( false ) diff --git a/include/comphelper/propmultiplex.hxx b/include/comphelper/propmultiplex.hxx index 30285f3e6204..0f5263ea82a5 100644 --- a/include/comphelper/propmultiplex.hxx +++ b/include/comphelper/propmultiplex.hxx @@ -24,6 +24,7 @@ #include #include #include +#include #include namespace com::sun::star::beans { class XPropertySet; } @@ -46,11 +47,12 @@ namespace comphelper friend class OPropertyChangeMultiplexer; rtl::Reference m_xAdapter; - ::osl::Mutex& m_rMutex; + // We have our own mutex here for the m_xAdapter field, because we sit between two different objects + // which often have their own mutexes, and if we use a mutex from one of them, + // we end up with ABBA deadlock risks. + std::mutex m_aAdapterMutex; public: - OPropertyChangeListener(::osl::Mutex& _rMutex) - : m_rMutex(_rMutex) { } virtual ~OPropertyChangeListener(); /// @throws css::uno::RuntimeException diff --git a/reportdesign/source/ui/dlg/AddField.cxx b/reportdesign/source/ui/dlg/AddField.cxx index 50a5cf5a5963..0289195c0545 100644 --- a/reportdesign/source/ui/dlg/AddField.cxx +++ b/reportdesign/source/ui/dlg/AddField.cxx @@ -61,7 +61,7 @@ IMPL_LINK(OAddFieldWindow, DragBeginHdl, bool&, rUnsetDragIcon, bool) OAddFieldWindow::OAddFieldWindow(weld::Window* pParent, uno::Reference< beans::XPropertySet > xRowSet) : GenericDialogController(pParent, u"modules/dbreport/ui/floatingfield.ui"_ustr, u"FloatingField"_ustr) - , ::comphelper::OPropertyChangeListener(m_aMutex) + , ::comphelper::OPropertyChangeListener() , ::comphelper::OContainerListener(m_aMutex) , m_xRowSet(std::move(xRowSet)) , m_xActions(m_xBuilder->weld_toolbar(u"toolbox"_ustr)) diff --git a/reportdesign/source/ui/dlg/GroupsSorting.cxx b/reportdesign/source/ui/dlg/GroupsSorting.cxx index 9998c037ac1a..8080f5d1a33b 100644 --- a/reportdesign/source/ui/dlg/GroupsSorting.cxx +++ b/reportdesign/source/ui/dlg/GroupsSorting.cxx @@ -785,7 +785,7 @@ Size OFieldExpressionControl::GetOptimalSize() const OGroupsSortingDialog::OGroupsSortingDialog(weld::Window* pParent, bool bReadOnly, OReportController* pController) : GenericDialogController(pParent, u"modules/dbreport/ui/floatingsort.ui"_ustr, u"FloatingSort"_ustr) - , OPropertyChangeListener(m_aMutex) + , OPropertyChangeListener() , m_pController(pController) , m_xGroups(m_pController->getReportDefinition()->getGroups()) , m_bReadOnly(bReadOnly) diff --git a/reportdesign/source/ui/dlg/Navigator.cxx b/reportdesign/source/ui/dlg/Navigator.cxx index e0cc989c689a..d1c48ba4382a 100644 --- a/reportdesign/source/ui/dlg/Navigator.cxx +++ b/reportdesign/source/ui/dlg/Navigator.cxx @@ -202,7 +202,7 @@ public: }; NavigatorTree::NavigatorTree(std::unique_ptr xTreeView, OReportController& rController) - : OPropertyChangeListener(m_aMutex) + : OPropertyChangeListener() , m_xTreeView(std::move(xTreeView)) , m_rController(rController) { @@ -672,7 +672,7 @@ void NavigatorTree::removeEntry(const weld::TreeIter& rEntry, bool bRemove) } NavigatorTree::UserData::UserData(NavigatorTree* pTree,uno::Reference xContent) - : OPropertyChangeListener(m_aMutex) + : OPropertyChangeListener() , OContainerListener(m_aMutex) , m_xContent(std::move(xContent)) , m_pTree(pTree) diff --git a/reportdesign/source/ui/report/ReportSection.cxx b/reportdesign/source/ui/report/ReportSection.cxx index 61e38fff8e8c..ca9842cef7ab 100644 --- a/reportdesign/source/ui/report/ReportSection.cxx +++ b/reportdesign/source/ui/report/ReportSection.cxx @@ -73,7 +73,7 @@ static Color lcl_getOverlappedControlColor(/*const uno::Reference _xSection) : Window(_pParent,WB_DIALOGCONTROL) - , ::comphelper::OPropertyChangeListener(m_aMutex) + , ::comphelper::OPropertyChangeListener() , DropTargetHelper(this) , m_pPage(nullptr) , m_pView(nullptr) diff --git a/reportdesign/source/ui/report/ReportWindow.cxx b/reportdesign/source/ui/report/ReportWindow.cxx index 8da0855f6146..91813270915f 100644 --- a/reportdesign/source/ui/report/ReportWindow.cxx +++ b/reportdesign/source/ui/report/ReportWindow.cxx @@ -47,7 +47,7 @@ using namespace ::comphelper; OReportWindow::OReportWindow(OScrollWindowHelper* _pParent,ODesignView* _pView) : Window(_pParent,WB_DIALOGCONTROL) -, ::comphelper::OPropertyChangeListener(m_aMutex) +, ::comphelper::OPropertyChangeListener() ,m_aHRuler(VclPtr::Create(this)) ,m_pView(_pView) ,m_pParent(_pParent) diff --git a/reportdesign/source/ui/report/ScrollHelper.cxx b/reportdesign/source/ui/report/ScrollHelper.cxx index 491710e94ba8..ba03cc6c4ad5 100644 --- a/reportdesign/source/ui/report/ScrollHelper.cxx +++ b/reportdesign/source/ui/report/ScrollHelper.cxx @@ -44,7 +44,7 @@ static void lcl_setScrollBar(sal_Int32 _nNewValue,const Point& _aPos,const Size& OScrollWindowHelper::OScrollWindowHelper( ODesignView* _pDesignView) : OScrollWindowHelper_BASE( _pDesignView,WB_DIALOGCONTROL) - ,OPropertyChangeListener(m_aMutex) + ,OPropertyChangeListener() ,m_aHScroll( VclPtr::Create(this, true) ) ,m_aVScroll( VclPtr::Create(this, false) ) ,m_pParent(_pDesignView) diff --git a/reportdesign/source/ui/report/SectionWindow.cxx b/reportdesign/source/ui/report/SectionWindow.cxx index 60d5235f84bb..74624c69662d 100644 --- a/reportdesign/source/ui/report/SectionWindow.cxx +++ b/reportdesign/source/ui/report/SectionWindow.cxx @@ -41,7 +41,7 @@ using namespace ::comphelper; OSectionWindow::OSectionWindow( OViewsWindow* _pParent,const uno::Reference< report::XSection >& _xSection,const OUString& _sColorEntry) : Window( _pParent,WB_DIALOGCONTROL) -,OPropertyChangeListener(m_aMutex) +,OPropertyChangeListener() ,m_pParent(_pParent) ,m_aStartMarker( VclPtr::Create(this,_sColorEntry)) ,m_aReportSection( VclPtr::Create(this,_xSection)) diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx index a8a87a8d0803..64947e7c8814 100644 --- a/svx/source/fmcomp/gridcell.cxx +++ b/svx/source/fmcomp/gridcell.cxx @@ -519,7 +519,7 @@ void DbGridColumn::ImplInitWindow( vcl::Window const & rParent, const InitWindow DbCellControl::DbCellControl( DbGridColumn& _rColumn ) - :OPropertyChangeListener(m_aMutex) + :OPropertyChangeListener() ,m_bTransparent( false ) ,m_bAlignedController( true ) ,m_bAccessingValueProperty( false ) diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx index b6fb24d05df7..b891f2081a04 100644 --- a/svx/source/fmcomp/gridctrl.cxx +++ b/svx/source/fmcomp/gridctrl.cxx @@ -143,7 +143,7 @@ public: }; GridFieldValueListener::GridFieldValueListener(DbGridControl& _rParent, const Reference< XPropertySet >& _rField, sal_uInt16 _nId) - :OPropertyChangeListener(m_aMutex) + :OPropertyChangeListener() ,m_rParent(_rParent) ,m_nId(_nId) ,m_nSuspended(0) @@ -254,7 +254,7 @@ public: }; FmXGridSourcePropListener::FmXGridSourcePropListener(DbGridControl* _pParent) - :OPropertyChangeListener(m_aMutex) + :OPropertyChangeListener() ,m_pParent(_pParent) ,m_nSuspended(0) {