ucb/source/core/ucbstore.cxx |   34 +++++++++++++---------------------
 ucb/source/core/ucbstore.hxx |    2 ++
 2 files changed, 15 insertions(+), 21 deletions(-)

New commits:
commit 20f3339834bedd4a62731f69c954dc6e6607bec5
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue Feb 14 11:32:24 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Feb 14 10:45:43 2023 +0000

    fix locking in PersistentPropertySet
    
    after
        commit 756185b5795c95180d32d02abfbd65951779b40e
        Author: Noel Grandin <noel.gran...@collabora.co.uk>
        Date:   Mon Feb 13 09:06:02 2023 +0200
        osl::Mutex->std::mutex in PersistentPropertySet
    
    Change-Id: Ie52432ea1566b840bd88692f00f4753eea7896f7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146998
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/ucb/source/core/ucbstore.cxx b/ucb/source/core/ucbstore.cxx
index 191605dd1f7f..65c0e531e2e2 100644
--- a/ucb/source/core/ucbstore.cxx
+++ b/ucb/source/core/ucbstore.cxx
@@ -1187,10 +1187,7 @@ void SAL_CALL PersistentPropertySet::setPropertyValue( 
const OUString& aProperty
                         aEvt.OldValue       = aOldValue;
                         aEvt.NewValue       = aValue;
 
-                        // Callback follows!
-                        aCGuard.unlock();
-
-                        notifyPropertyChangeEvent( aEvt );
+                        notifyPropertyChangeEvent( aCGuard, aEvt );
                     }
                     return;
                 }
@@ -1442,7 +1439,7 @@ void SAL_CALL PersistentPropertySet::addProperty(
                                     Name,
                                     -1,
                                     PropertySetInfoChange::PROPERTY_INSERTED );
-                    notifyPropertySetInfoChange( evt );
+                    notifyPropertySetInfoChange(aGuard, evt);
                 }
 
                 // Success.
@@ -1600,7 +1597,7 @@ void SAL_CALL PersistentPropertySet::removeProperty( 
const OUString& Name )
                                     Name,
                                     nHandle,
                                     PropertySetInfoChange::PROPERTY_REMOVED );
-                    notifyPropertySetInfoChange( evt );
+                    notifyPropertySetInfoChange( aGuard, evt );
                 }
 
                 // Success.
@@ -1883,13 +1880,10 @@ void SAL_CALL PersistentPropertySet::setPropertyValues(
 
         if ( m_pPropertyChangeListeners )
         {
-            // Callback follows!
-            aCGuard.unlock();
-
             // Notify property changes.
             for (auto const& event : aEvents)
             {
-                notifyPropertyChangeEvent( event );
+                notifyPropertyChangeEvent( aCGuard, event );
             }
         }
 
@@ -1904,38 +1898,36 @@ void SAL_CALL PersistentPropertySet::setPropertyValues(
 
 
 void PersistentPropertySet::notifyPropertyChangeEvent(
+                                    std::unique_lock<std::mutex>& rGuard,
                                     const PropertyChangeEvent& rEvent ) const
 {
-    std::unique_lock aGuard(m_aMutex);
-
     // Get "normal" listeners for the property.
     OInterfaceContainerHelper4<XPropertyChangeListener>* pContainer =
-            m_pPropertyChangeListeners->getContainer( aGuard, 
rEvent.PropertyName );
-    if ( pContainer && pContainer->getLength(aGuard) )
+            m_pPropertyChangeListeners->getContainer( rGuard, 
rEvent.PropertyName );
+    if ( pContainer && pContainer->getLength(rGuard) )
     {
-        pContainer->notifyEach( aGuard, 
&XPropertyChangeListener::propertyChange, rEvent );
+        pContainer->notifyEach( rGuard, 
&XPropertyChangeListener::propertyChange, rEvent );
     }
 
     // Get "normal" listeners for all properties.
     OInterfaceContainerHelper4<XPropertyChangeListener>* pNoNameContainer =
-            m_pPropertyChangeListeners->getContainer( aGuard, OUString() );
-    if ( pNoNameContainer && pNoNameContainer->getLength(aGuard) )
+            m_pPropertyChangeListeners->getContainer( rGuard, OUString() );
+    if ( pNoNameContainer && pNoNameContainer->getLength(rGuard) )
     {
-        pNoNameContainer->notifyEach( aGuard, 
&XPropertyChangeListener::propertyChange, rEvent );
+        pNoNameContainer->notifyEach( rGuard, 
&XPropertyChangeListener::propertyChange, rEvent );
     }
 }
 
 
 void PersistentPropertySet::notifyPropertySetInfoChange(
+                                std::unique_lock<std::mutex>& rGuard,
                                 const PropertySetInfoChangeEvent& evt ) const
 {
-    std::unique_lock aGuard(m_aMutex);
-
     if ( !m_pPropSetChangeListeners )
         return;
 
     // Notify event listeners.
-    m_pPropSetChangeListeners->notifyEach( aGuard, 
&XPropertySetInfoChangeListener::propertySetInfoChange, evt );
+    m_pPropSetChangeListeners->notifyEach( rGuard, 
&XPropertySetInfoChangeListener::propertySetInfoChange, evt );
 }
 
 
diff --git a/ucb/source/core/ucbstore.hxx b/ucb/source/core/ucbstore.hxx
index dceb65733864..5f431fa8ac0d 100644
--- a/ucb/source/core/ucbstore.hxx
+++ b/ucb/source/core/ucbstore.hxx
@@ -169,8 +169,10 @@ class PersistentPropertySet : public cppu::WeakImplHelper <
 
 private:
     void notifyPropertyChangeEvent(
+        std::unique_lock<std::mutex>& rGuard,
         const css::beans::PropertyChangeEvent& rEvent ) const;
     void notifyPropertySetInfoChange(
+        std::unique_lock<std::mutex>& rGuard,
         const css::beans::PropertySetInfoChangeEvent& evt ) const;
 
 public:

Reply via email to