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