desktop/source/deployment/registry/package/dp_package.cxx |    9 ------
 embeddedobj/source/inc/oleembobj.hxx                      |   16 ----------
 embeddedobj/source/msole/oleembed.cxx                     |    4 +-
 embeddedobj/source/msole/olevisual.cxx                    |    2 -
 include/osl/mutex.hxx                                     |   21 ++++++++++++++
 svl/source/undo/undo.cxx                                  |   11 -------
 6 files changed, 27 insertions(+), 36 deletions(-)

New commits:
commit 466156f14d8dee7e3e629dd72dc9c40ddc7262e8
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu Apr 4 12:04:12 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Thu Apr 4 13:21:14 2024 +0200

    Use osl::ResettableMutexGuardScopedReleaser instead of ad-hoc guards
    
    Change-Id: I2aa09655c207d3647650b5e38011a600bd221699
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165777
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/embeddedobj/source/inc/oleembobj.hxx 
b/embeddedobj/source/inc/oleembobj.hxx
index 983f242308cf..087a3c829527 100644
--- a/embeddedobj/source/inc/oleembobj.hxx
+++ b/embeddedobj/source/inc/oleembobj.hxx
@@ -454,26 +454,12 @@ public:
     css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() 
override;
 };
 
-class ClearedMutexArea
-{
-public:
-    ClearedMutexArea(osl::ResettableMutexGuard& guard)
-        : m_guard(guard)
-    {
-        m_guard.clear();
-    }
-    ~ClearedMutexArea() { m_guard.reset(); }
-
-private:
-    osl::ResettableMutexGuard& m_guard;
-};
-
 namespace
 {
 #if defined(_WIN32)
 template <class Proc> auto ExecUnlocked(Proc proc, osl::ResettableMutexGuard& 
guard)
 {
-    ClearedMutexArea area(guard);
+    osl::ResettableMutexGuardScopedReleaser area(guard);
     return proc();
 }
 #endif
diff --git a/embeddedobj/source/msole/oleembed.cxx 
b/embeddedobj/source/msole/oleembed.cxx
index a7a2bf661d70..a055ceae2249 100644
--- a/embeddedobj/source/msole/oleembed.cxx
+++ b/embeddedobj/source/msole/oleembed.cxx
@@ -870,7 +870,7 @@ void SAL_CALL OleEmbeddedObject::doVerb( sal_Int32 nVerbID )
             m_aVerbExecutionController.StartControlExecution();
 
             {
-                ClearedMutexArea clearedMutex(aGuard);
+                osl::ResettableMutexGuardScopedReleaser clearedMutex(aGuard);
                 m_pOleComponent->ExecuteVerb(nVerbID);
                 m_pOleComponent->SetHostName(m_aContainerName);
             }
@@ -1153,7 +1153,7 @@ sal_Int64 SAL_CALL OleEmbeddedObject::getStatus( sal_Int64
     else if ( m_pOleComponent )
     {
         {
-            ClearedMutexArea clearedMutex(aGuard);
+            osl::ResettableMutexGuardScopedReleaser clearedMutex(aGuard);
             m_nStatus = m_pOleComponent->GetMiscStatus(nAspect);
         }
         m_nStatusAspect = nAspect;
diff --git a/embeddedobj/source/msole/olevisual.cxx 
b/embeddedobj/source/msole/olevisual.cxx
index bcbacffe5d64..7b3e12e7339a 100644
--- a/embeddedobj/source/msole/olevisual.cxx
+++ b/embeddedobj/source/msole/olevisual.cxx
@@ -365,7 +365,7 @@ embed::VisualRepresentation SAL_CALL 
OleEmbeddedObject::getPreferredVisualRepres
 
             embed::VisualRepresentation aVisualRepr;
             {
-                ClearedMutexArea clearedMutex(aGuard);
+                osl::ResettableMutexGuardScopedReleaser clearedMutex(aGuard);
                 aVisualRepr.Data = 
m_pOleComponent->getTransferData(aDataFlavor);
             }
             aVisualRepr.Flavor = aDataFlavor;
diff --git a/svl/source/undo/undo.cxx b/svl/source/undo/undo.cxx
index 96c937c037ad..488a0538244f 100644
--- a/svl/source/undo/undo.cxx
+++ b/svl/source/undo/undo.cxx
@@ -283,16 +283,7 @@ namespace svl::undo::impl
 
         ~UndoManagerGuard();
 
-        struct ResetGuard {
-            ResetGuard(osl::ResettableMutexGuard& r) : rGuard(r) {}
-            ~ResetGuard() { rGuard.reset(); }
-            osl::ResettableMutexGuard& rGuard;
-        };
-        ResetGuard clear()
-        {
-            m_aGuard.clear();
-            return ResetGuard(m_aGuard);
-        }
+        auto clear() { return 
osl::ResettableMutexGuardScopedReleaser(m_aGuard); }
 
         void cancelNotifications()
         {
commit 6eefe3a29df4b0862a455a2d057e4a7d88457c71
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu Apr 4 11:26:53 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Thu Apr 4 13:21:09 2024 +0200

    Introduce ResettableMutexGuardScopedReleaser
    
    And use it to guarantee reretting a guard, without having to do that
    explicitly in exception handlers.
    
    Change-Id: I4727cb5b7f37b25e203396957797d24a093e0797
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165775
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/desktop/source/deployment/registry/package/dp_package.cxx 
b/desktop/source/deployment/registry/package/dp_package.cxx
index d5c1feeb4992..494ce437e1e9 100644
--- a/desktop/source/deployment/registry/package/dp_package.cxx
+++ b/desktop/source/deployment/registry/package/dp_package.cxx
@@ -808,14 +808,11 @@ void BackendImpl::PackageImpl::processPackage_(
                 // can occur if the main thread calls isRegistered() on this
                 // package or any of its parents. So, temporarily release
                 // this package's mutex while registering the child package.
-                guard.clear();
+                osl::ResettableMutexGuardScopedReleaser releaser(guard);
                 xPackage->registerPackage( startup, xSubAbortChannel, xCmdEnv 
);
-                guard.reset();
             }
             catch (const Exception &)
             {
-                guard.reset();
-
                //We even try a rollback if the user cancelled the action 
(CommandAbortedException)
                 //in order to prevent invalid database entries.
                 Any exc( ::cppu::getCaughtException() );
@@ -866,10 +863,6 @@ void BackendImpl::PackageImpl::processPackage_(
                     ::cppu::throwException(exc);
                 }
             }
-            catch (...) {
-                guard.reset();
-                throw;
-            }
 
             data.items.emplace_back(xPackage->getURL(),
                                  xPackage->getPackageType()->getMediaType());
diff --git a/include/osl/mutex.hxx b/include/osl/mutex.hxx
index 481a2bb55002..ca75cc9fb2dc 100644
--- a/include/osl/mutex.hxx
+++ b/include/osl/mutex.hxx
@@ -252,9 +252,30 @@ namespace osl
         }
     };
 
+#ifdef LIBO_INTERNAL_ONLY
+    // A RAII helper to allow exception-safe scoped release of an acquired 
object
+    template<class ResettableGuard_t>
+    class ResettableGuardScopedReleaser
+    {
+    public:
+        ResettableGuardScopedReleaser(ResettableGuard_t& r)
+            : m_rResettableGuard(r)
+        {
+            m_rResettableGuard.clear();
+        }
+        ~ResettableGuardScopedReleaser() { m_rResettableGuard.reset(); }
+
+    private:
+        ResettableGuard_t& m_rResettableGuard;
+    };
+#endif
+
     typedef Guard<Mutex> MutexGuard;
     typedef ClearableGuard<Mutex> ClearableMutexGuard;
     typedef ResettableGuard< Mutex > ResettableMutexGuard;
+#ifdef LIBO_INTERNAL_ONLY
+    typedef ResettableGuardScopedReleaser<ResettableMutexGuard> 
ResettableMutexGuardScopedReleaser;
+#endif
 }
 
 #endif // INCLUDED_OSL_MUTEX_HXX

Reply via email to