sd/source/ui/accessibility/AccessibleSlideSorterView.cxx |   22 +++++++--------
 sd/source/ui/inc/AccessibleSlideSorterView.hxx           |   12 ++++----
 2 files changed, 18 insertions(+), 16 deletions(-)

New commits:
commit 18444c2822e6561aa302f28f8166042b8dad0fe1
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Tue Jan 4 16:05:01 2022 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Tue Jan 4 17:04:02 2022 +0100

    Revert "use comphelper::WeakComponentImplHelper in 
AccessibleSlideSorterView"
    
    This reverts commit 2d541dedde4ec516eacd7669bdc3ed8fb6fc2548. It
    switched to a non-recursive mutex in AccessibleSlideSorterView, which
    now deadlocks regularly when opening Impress documents:
    
            #0  0x00007ffff65b5de3 in __lll_lock_wait () at 
/lib64/libpthread.so.0
            #1  0x00007ffff65ae301 in pthread_mutex_lock () at 
/lib64/libpthread.so.0
            #2  0x00007fffcdac12ed in __gthread_mutex_lock(__gthread_mutex_t*) 
(__mutex=0x5646c40) at 
/usr/include/c++/7/x86_64-suse-linux/bits/gthr-default.h:748
            #3  0x00007fffcdac2f40 in std::mutex::lock() (this=0x5646c40) at 
/usr/include/c++/7/bits/std_mutex.h:103
            #4  0x00007fffcdac3fcf in std::unique_lock<std::mutex>::lock() 
(this=0x7fffffffb980) at /usr/include/c++/7/bits/std_mutex.h:267
            #5  0x00007fffcdac3c86 in 
std::unique_lock<std::mutex>::unique_lock(std::mutex&) (this=0x7fffffffb980, 
__m=...) at /usr/include/c++/7/bits/std_mutex.h:197
            #6  0x00007fffcdac514b in 
accessibility::AccessibleSlideSorterView::getAccessibleChildCount() 
(this=0x5646c10) at sd/source/ui/accessibility/AccessibleSlideSorterView.cxx:200
            #7  0x00007fffdce577c3 in 
AtkListener::updateChildList(com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleContext>
 const&) (this=0x5647130, pContext=uno::Reference to (class 
accessibility::AccessibleSlideSorterView *) 0x5646c88) at 
vcl/unx/gtk3/a11y/atklistener.cxx:149
            #8  0x00007fffdce579e0 in 
AtkListener::handleChildAdded(com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleContext>
 const&, 
com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> 
const&) (this=0x5647130, rxParent=uno::Reference to (class 
accessibility::AccessibleSlideSorterView *) 0x5646c88, 
rxAccessible=uno::Reference to (class 
accessibility::AccessibleSlideSorterObject *) 0x42d3698) at 
vcl/unx/gtk3/a11y/atklistener.cxx:178
            #9  0x00007fffdce5806e in 
AtkListener::notifyEvent(com::sun::star::accessibility::AccessibleEventObject 
const&) (this=0x5647130, aEvent=...) at vcl/unx/gtk3/a11y/atklistener.cxx:441
            #10 0x00007ffff4fef0d5 in 
comphelper::AccessibleEventNotifier::addEvent(unsigned int, 
com::sun::star::accessibility::AccessibleEventObject const&) (_nClient=44, 
_rEvent=...) at comphelper/source/misc/accessibleeventnotifier.cxx:262
            #11 0x00007fffcdac4df2 in 
accessibility::AccessibleSlideSorterView::FireAccessibleEvent(short, 
com::sun::star::uno::Any const&, com::sun::star::uno::Any const&) 
(this=0x5646c10, nEventId=7, rOldValue=uno::Any(void), 
rNewValue=uno::Any("com.sun.star.accessibility.XAccessible": 
{<com::sun::star::uno::XInterface> = {_vptr.XInterface = 0x42d3698}, <No data 
fields>})) at sd/source/ui/accessibility/AccessibleSlideSorterView.cxx:148
            #12 0x00007fffcdac7bf0 in 
accessibility::AccessibleSlideSorterView::Implementation::GetAccessibleChild(int)
 (this=0x5646ce0, nIndex=1) at 
sd/source/ui/accessibility/AccessibleSlideSorterView.cxx:746
            #13 0x00007fffcdac79ca in 
accessibility::AccessibleSlideSorterView::Implementation::GetVisibleChild(int) 
(this=0x5646ce0, nIndex=1) at 
sd/source/ui/accessibility/AccessibleSlideSorterView.cxx:725
            #14 0x00007fffcdac529d in 
accessibility::AccessibleSlideSorterView::getAccessibleChild(int) 
(this=0x5646c10, nIndex=1) at 
sd/source/ui/accessibility/AccessibleSlideSorterView.cxx:213
    
    The problem is that both getAccessibleChild() and
    getAccessibleChildCount() take a lock, so this requires a resursive
    mutex for now.
    
    Change-Id: I32205d19451d86e112922e3194661cce2406f70a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127946
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx 
b/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx
index b4f7d79d6ead..87eea89d2199 100644
--- a/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx
+++ b/sd/source/ui/accessibility/AccessibleSlideSorterView.cxx
@@ -47,7 +47,6 @@
 #include <rtl/ref.hxx>
 #include <sal/log.hxx>
 #include <i18nlangtag/languagetag.hxx>
-#include <osl/diagnose.h>
 
 #include <vcl/settings.hxx>
 #include <vcl/svapp.hxx>
@@ -115,7 +114,8 @@ private:
 AccessibleSlideSorterView::AccessibleSlideSorterView(
     ::sd::slidesorter::SlideSorter& rSlideSorter,
     vcl::Window* pContentWindow)
-    : mrSlideSorter(rSlideSorter),
+    : AccessibleSlideSorterViewBase(m_aMutex),
+      mrSlideSorter(rSlideSorter),
       mnClientId(0),
       mpContentWindow(pContentWindow)
 {
@@ -149,7 +149,7 @@ void AccessibleSlideSorterView::FireAccessibleEvent (
     }
 }
 
-void AccessibleSlideSorterView::disposing(std::unique_lock<std::mutex>&)
+void SAL_CALL AccessibleSlideSorterView::disposing()
 {
     if (mnClientId != 0)
     {
@@ -163,7 +163,7 @@ AccessibleSlideSorterObject* 
AccessibleSlideSorterView::GetAccessibleChildImplem
     sal_Int32 nIndex)
 {
     AccessibleSlideSorterObject* pResult = nullptr;
-    std::unique_lock aGuard (m_aMutex);
+    ::osl::MutexGuard aGuard (m_aMutex);
 
     if (nIndex>=0 && nIndex<mpImpl->GetVisibleChildCount())
         pResult = mpImpl->GetVisibleChild(nIndex);
@@ -173,7 +173,7 @@ AccessibleSlideSorterObject* 
AccessibleSlideSorterView::GetAccessibleChildImplem
 
 void AccessibleSlideSorterView::Destroyed()
 {
-    std::unique_lock aGuard (m_aMutex);
+    ::osl::MutexGuard aGuard (m_aMutex);
 
     // Send a disposing to all listeners.
     if (mnClientId != 0)
@@ -197,7 +197,7 @@ Reference<XAccessibleContext > SAL_CALL
 sal_Int32 SAL_CALL AccessibleSlideSorterView::getAccessibleChildCount()
 {
     ThrowIfDisposed();
-    std::unique_lock aGuard (m_aMutex);
+    ::osl::MutexGuard aGuard (m_aMutex);
     return mpImpl->GetVisibleChildCount();
 }
 
@@ -205,7 +205,7 @@ Reference<XAccessible > SAL_CALL
     AccessibleSlideSorterView::getAccessibleChild (sal_Int32 nIndex)
 {
     ThrowIfDisposed();
-    std::unique_lock aGuard (m_aMutex);
+    ::osl::MutexGuard aGuard (m_aMutex);
 
     if (nIndex<0 || nIndex>=mpImpl->GetVisibleChildCount())
         throw lang::IndexOutOfBoundsException();
@@ -325,9 +325,9 @@ void SAL_CALL 
AccessibleSlideSorterView::addAccessibleEventListener(
     if (!rxListener.is())
         return;
 
-    const std::unique_lock aGuard(m_aMutex);
+    const osl::MutexGuard aGuard(m_aMutex);
 
-    if (m_bDisposed)
+    if (rBHelper.bDisposed || rBHelper.bInDispose)
     {
         uno::Reference<uno::XInterface> x (static_cast<lang::XComponent 
*>(this), uno::UNO_QUERY);
         rxListener->disposing (lang::EventObject (x));
@@ -347,7 +347,7 @@ void SAL_CALL 
AccessibleSlideSorterView::removeAccessibleEventListener(
     if (!rxListener.is())
         return;
 
-    const std::unique_lock aGuard(m_aMutex);
+    const osl::MutexGuard aGuard(m_aMutex);
 
     if (mnClientId == 0)
         return;
@@ -612,7 +612,7 @@ uno::Sequence< OUString> SAL_CALL
 
 void AccessibleSlideSorterView::ThrowIfDisposed()
 {
-    if (m_bDisposed)
+    if (rBHelper.bDisposed || rBHelper.bInDispose)
     {
         SAL_WARN("sd", "Calling disposed object. Throwing exception:");
         throw lang::DisposedException ("object has been already disposed",
diff --git a/sd/source/ui/inc/AccessibleSlideSorterView.hxx 
b/sd/source/ui/inc/AccessibleSlideSorterView.hxx
index b547f7e51432..85003b72d138 100644
--- a/sd/source/ui/inc/AccessibleSlideSorterView.hxx
+++ b/sd/source/ui/inc/AccessibleSlideSorterView.hxx
@@ -19,7 +19,8 @@
 
 #pragma once
 
-#include <comphelper/compbase.hxx>
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase.hxx>
 #include <com/sun/star/accessibility/XAccessible.hpp>
 #include <com/sun/star/accessibility/XAccessibleContext.hpp>
 #include <com/sun/star/accessibility/XAccessibleComponent.hpp>
@@ -37,7 +38,7 @@ namespace accessibility {
 
 class AccessibleSlideSorterObject;
 
-typedef comphelper::WeakComponentImplHelper<
+typedef ::cppu::WeakComponentImplHelper<
     css::accessibility::XAccessible,
     css::accessibility::XAccessibleEventBroadcaster,
     css::accessibility::XAccessibleContext,
@@ -50,8 +51,9 @@ typedef comphelper::WeakComponentImplHelper<
     of the AccessibleSlideSorterObject class to the make the page objects
     accessible.
 */
-class AccessibleSlideSorterView final
-    : public AccessibleSlideSorterViewBase
+class AccessibleSlideSorterView
+    : public cppu::BaseMutex,
+      public AccessibleSlideSorterViewBase
 {
 public:
     AccessibleSlideSorterView(
@@ -72,7 +74,7 @@ public:
         const css::uno::Any& rOldValue,
         const css::uno::Any& rNewValue);
 
-    virtual void disposing(std::unique_lock<std::mutex>&) override;
+    virtual void SAL_CALL disposing() override;
 
     /** Return the implementation object of the specified child.
         @param nIndex

Reply via email to