comphelper/source/property/propmultiplex.cxx      |   20 ++++++++++++----
 extensions/source/propctrlr/submissionhandler.cxx |    2 -
 forms/source/component/DatabaseForm.cxx           |   26 ++++++++++++++++------
 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 +--
 reportdesign/source/ui/report/ReportSection.cxx   |    2 -
 reportdesign/source/ui/report/ReportWindow.cxx    |    2 -
 reportdesign/source/ui/report/ScrollHelper.cxx    |    2 -
 reportdesign/source/ui/report/SectionWindow.cxx   |    2 -
 svx/source/fmcomp/gridcell.cxx                    |    2 -
 svx/source/fmcomp/gridctrl.cxx                    |    4 +--
 15 files changed, 55 insertions(+), 31 deletions(-)

New commits:
commit f9ff22db058180d161b32f5dcd87e72cfa3b6889
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon Sep 9 10:50:07 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Sep 9 16:08:42 2024 +0200

    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<osl::Mutex>::Guard(osl::Mutex&)
    /home/noel/libo-tsan/include/osl/mutex.hxx:144
    (libuno_cppuhelpergcc3.so.3+0x8fdd9)
    4 cppu::OBroadcastHelperVar<cppu::OMultiTypeInterfaceContainerHelper,
    com::sun::star::uno::Type>::addListener(com::sun::star::uno::Type
    const&, com::sun::star::uno::Reference<com::sun::star::uno::XInterface>
    const&) /home/noel/libo-tsan/include/cppuhelper/interfacecontainer.h:468
    (libuno_cppuhelpergcc3.so.3+0x8fdd9)
    5
    
cppu::OPropertySetHelper::addPropertiesChangeListener(com::sun::star::uno::Sequence<rtl::OUString>
    const&,
    
com::sun::star::uno::Reference<com::sun::star::beans::XPropertiesChangeListener>
    const&) /home/noel/libo-tsan/cppuhelper/source/propshlp.cxx:912
    (libuno_cppuhelpergcc3.so.3+0x8fdd9)
    6
    
comphelper::OPropertySetAggregationHelper::addPropertiesChangeListener(com::sun::star::uno::Sequence<rtl::OUString>
    const&,
    
com::sun::star::uno::Reference<com::sun::star::beans::XPropertiesChangeListener>
    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<com::sun::star::beans::XPropertyChangeListener>
    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<com::sun::star::beans::XPropertyChangeListener>
    const&) /home/noel/libo-tsan/comphelper/source/property/propagg.cxx:?
    (libcomphelper.so+0x1a181a)
    10 frm::OInterfaceContainer::implInsert(int,
    com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet>
    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<com::sun::star::drawing::XShape>
    const&) /home/noel/libo-tsan/svx/source/unodraw/unopage.cxx:191
    (libsvxcorelo.so+0x850c7b)
    21
    
SwFmDrawPage::add(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
    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<com::sun::star::drawing::XShape>
    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<osl::Mutex>::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<SdrObject>::~Reference()
    /home/noel/libo-tsan/include/rtl/ref.hxx:126 (libsvxcorelo.so+0x61610d)
    25 void std::destroy_at<rtl::Reference<SdrObject>
    >(rtl::Reference<SdrObject>*)
    
/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<SdrObject>
    >(rtl::Reference<SdrObject>*)
    
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_construct.h:149
    (libsvxcorelo.so+0x61610d)
    27 void
    
std::_Destroy_aux<false>::__destroy<rtl::Reference<SdrObject>*>(rtl::Reference<SdrObject>*,
    rtl::Reference<SdrObject>*)
    
/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<SdrObject>*>(rtl::Reference<SdrObject>*,
    rtl::Reference<SdrObject>*)
    
/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<SdrObject>*,
    rtl::Reference<SdrObject> >(rtl::Reference<SdrObject>*,
    rtl::Reference<SdrObject>*, std::allocator<rtl::Reference<SdrObject> >&)
    
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/alloc_traits.h:948
    (libsvxcorelo.so+0x61610d)
    30 std::vector<rtl::Reference<SdrObject>,
    std::allocator<rtl::Reference<SdrObject> > >::~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<SwDrawModel>::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<SwDrawModel, std::default_delete<SwDrawModel>
    >::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<SwDrawModel, std::default_delete<SwDrawModel>
    >::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<SwDoc>::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<SfxObjectShell>::~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>(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>(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<std::allocator<void>
    >::destroy<IMPL_SfxBaseModel_DataContainer>(std::allocator<void>&,
    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<IMPL_SfxBaseModel_DataContainer,
    std::allocator<void>, (__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 <noel.gran...@collabora.co.uk>

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<OPropertyChangeMultiplexer> 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<OPropertyChangeMultiplexer> 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<XComponentContext>& _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<XComponentContext>& _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<XComponentContext>& 
_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 <cppuhelper/implbase.hxx>
 #include <comphelper/comphelperdllapi.h>
 #include <rtl/ref.hxx>
+#include <mutex>
 #include <vector>
 
 namespace com::sun::star::beans { class XPropertySet; }
@@ -46,11 +47,12 @@ namespace comphelper
         friend class OPropertyChangeMultiplexer;
 
         rtl::Reference<OPropertyChangeMultiplexer> 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<weld::TreeView> 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<uno::XInterface> 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 <lang::XMultiS
 
 OReportSection::OReportSection(OSectionWindow* _pParent,uno::Reference< 
report::XSection > _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<Ruler>::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<ScrollAdaptor>::Create(this, true) )
     ,m_aVScroll( VclPtr<ScrollAdaptor>::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<rptui::OStartMarker>::Create(this,_sColorEntry))
 ,m_aReportSection( VclPtr<rptui::OReportSection>::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)
 {
commit 07db23624497d303dca142ba9376cdcf265b20d8
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Thu Sep 5 14:39:50 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Sep 9 16:08:33 2024 +0200

    tsan:lock-order-inversion in forms
    
    ThreadSanitizer: lock-order-inversion (potential deadlock)
    Cycle in lock order graph: M0 (0x720c00011640) => M1 (0x720c00474120) =>
    M0
    
    Mutex M1 acquired here while holding mutex M0 in thread T8:
    3 osl::Guard<osl::Mutex>::Guard(osl::Mutex&)
    4
    
comphelper::OPropertySetAggregationHelper::setAggregation(com::sun::star::uno::Reference<com::sun::star::uno::XInterface>
    const&)
      ^^ acquires cppu mutex
    5 frm::ODatabaseForm::impl_construct()
    6
    
frm::ODatabaseForm::ODatabaseForm(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext>
    const&)
    7 com_sun_star_comp_forms_ODatabaseForm_get_implementation
    12
    
cppuhelper::ServiceManager::Data::Implementation::doCreateInstance(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext>
    const&)
    13
    
cppuhelper::ServiceManager::Data::Implementation::createInstance(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext>
    const&, bool)
    14 cppuhelper::ServiceManager::createInstanceWithContext(rtl::OUString
    const&,
    com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext>
    const&)
    15 cppuhelper::ServiceManager::createInstance(rtl::OUString const&)
    16 non-virtual thunk to
    cppuhelper::ServiceManager::createInstance(rtl::OUString const&)
    17 FmFormPageImpl::getDefaultForm()
    18
    
FmFormPageImpl::findPlaceInFormComponentHierarchy(com::sun::star::uno::Reference<com::sun::star::form::XFormComponent>
    const&,
    com::sun::star::uno::Reference<com::sun::star::sdbc::XDataSource>
    const&, rtl::OUString const&, rtl::OUString const&, int)
    19 FmXUndoEnvironment::Inserted(FmFormObj*)
    20 FmXUndoEnvironment::Inserted(SdrObject*)
    21 FmXUndoEnvironment::Notify(SfxBroadcaster&, SfxHint const&)
    22 non-virtual thunk to FmXUndoEnvironment::Notify(SfxBroadcaster&,
    SfxHint const&)
    23 SfxBroadcaster::Broadcast(SfxHint const&)
    24 SdrObjList::InsertObject(SdrObject*, unsigned long)
    25 FmFormPage::InsertObject(SdrObject*, unsigned long)
    26
    
SvxDrawPage::add(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
    const&)
    27
    
SwFmDrawPage::add(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
    const&)
      ^^ acquires solar mutex
    28 non-virtual thunk to
    
SwFmDrawPage::add(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
    const&)
    33 binaryurp::IncomingRequest::execute() const
    35 cppu_threadpool::JobQueue::enter(void const*, bool)
    
    Mutex M0 acquired here while holding mutex M1 in thread T8:
    6 SolarMutexClearableGuard::SolarMutexClearableGuard()
    7 SfxModelGuard::SfxModelGuard(SfxBaseModel const&,
    SfxModelGuard::AllowedModelState)
      ^^ acquires solar mutex
    8 SfxBaseModel::getArgs2(com::sun::star::uno::Sequence<rtl::OUString>
    const&)
    9 SfxBaseModel::getArgs()
    10 SwXTextDocument::getArgs()
    11 non-virtual thunk to SwXTextDocument::getArgs()
    12
    
dbtools::isEmbeddedInDatabase(com::sun::star::uno::Reference<com::sun::star::uno::XInterface>
    const&,
    com::sun::star::uno::Reference<com::sun::star::sdbc::XConnection>&)
    13 frm::ODatabaseForm::setFastPropertyValue_NoBroadcast(int,
    com::sun::star::uno::Any const&)
    15 cppu::OPropertySetHelper::setFastPropertyValue(int,
    com::sun::star::uno::Any const&)
      ^^ acquires cppu mutex
    16 comphelper::OPropertySetAggregationHelper::setFastPropertyValue(int,
    com::sun::star::uno::Any const&)
    17 cppu::OPropertySetHelper::setPropertyValue(rtl::OUString const&,
    com::sun::star::uno::Any const&)
    18 non-virtual thunk to
    cppu::OPropertySetHelper::setPropertyValue(rtl::OUString const&,
    com::sun::star::uno::Any const&)
    20 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+0x2118a)
    22 binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny*,
    std::vector<binaryurp::BinaryAny, std::allocator<binaryurp::BinaryAny>
    >*) const
    23 binaryurp::IncomingRequest::execute() const
    
    Change-Id: I00de2ad02b7ab247ee0aa62abcb11f5d46c9b157
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173067
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins

diff --git a/forms/source/component/DatabaseForm.cxx 
b/forms/source/component/DatabaseForm.cxx
index ee4867a77263..9d121cdf654a 100644
--- a/forms/source/component/DatabaseForm.cxx
+++ b/forms/source/component/DatabaseForm.cxx
@@ -30,6 +30,7 @@
 #include <property.hxx>
 #include <services.hxx>
 #include <comphelper/propertyvalue.hxx>
+#include <comphelper/guarding.hxx>
 
 #include <com/sun/star/awt/XControlContainer.hpp>
 #include <com/sun/star/awt/XTextComponent.hpp>
@@ -1640,10 +1641,14 @@ void ODatabaseForm::setFastPropertyValue_NoBroadcast( 
sal_Int32 nHandle, const A
 
         case PROPERTY_ID_DATASOURCE:
         {
-            Reference< XConnection > xSomeConnection;
-            if ( ::dbtools::isEmbeddedInDatabase( getParent(), xSomeConnection 
) )
-                throw PropertyVetoException();
-
+            css::uno::Reference<XInterface> xParent = getParent();
+            {
+                // prevent ABBA deadlock between this mutex and the SolarMutex
+                comphelper::MutexRelease aReleaser(m_aMutex);
+                Reference< XConnection > xSomeConnection;
+                if ( ::dbtools::isEmbeddedInDatabase( xParent, xSomeConnection 
) )
+                    throw PropertyVetoException();
+            }
             try
             {
                 m_xAggregateSet->setPropertyValue(PROPERTY_DATASOURCENAME, 
rValue);
@@ -1706,8 +1711,15 @@ void ODatabaseForm::setFastPropertyValue_NoBroadcast( 
sal_Int32 nHandle, const A
 
         case PROPERTY_ID_ACTIVE_CONNECTION:
         {
+            bool bIsEmbeddedInDatabase;
             Reference< XConnection > xOuterConnection;
-            if ( ::dbtools::isEmbeddedInDatabase( getParent(), 
xOuterConnection ) )
+            css::uno::Reference<XInterface> xParent = getParent();
+            {
+                // prevent ABBA deadlock between this mutex and the SolarMutex
+                comphelper::MutexRelease aReleaser(m_aMutex);
+                bIsEmbeddedInDatabase = ::dbtools::isEmbeddedInDatabase( 
xParent, xOuterConnection );
+            }
+            if (bIsEmbeddedInDatabase)
             {
                 if ( xOuterConnection != Reference< XConnection >( rValue, 
UNO_QUERY ) )
                     // somebody's trying to set a connection which is not 
equal the connection

Reply via email to