basic/source/inc/namecont.hxx | 11 +++++------ basic/source/uno/namecont.cxx | 42 ++++++++++++++++++++++++++---------------- vcl/source/app/session.cxx | 34 ++++++++++++++++------------------ 3 files changed, 47 insertions(+), 40 deletions(-)
New commits: commit 97c791d42f049763b0d3b01b4d2dc75cede9e858 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Mar 27 15:03:03 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Mar 29 07:42:07 2024 +0100 convert VCLSession to comphelper::WeakComponentImplHelper Change-Id: I74bc44f84dd6dccde602c31a0f87a1780e3e7231 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165495 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/vcl/source/app/session.cxx b/vcl/source/app/session.cxx index d61902fcf647..3f1ff9cb2f9b 100644 --- a/vcl/source/app/session.cxx +++ b/vcl/source/app/session.cxx @@ -21,8 +21,7 @@ #include <sal/config.h> #include <sal/log.hxx> -#include <cppuhelper/basemutex.hxx> -#include <cppuhelper/compbase.hxx> +#include <comphelper/compbase.hxx> #include <cppuhelper/supportsservice.hxx> #include <comphelper/diagnose_ex.hxx> @@ -52,8 +51,7 @@ SalSession::~SalSession() namespace { class VCLSession: - private cppu::BaseMutex, - public cppu::WeakComponentImplHelper < XSessionManagerClient, css::lang::XServiceInfo > + public comphelper::WeakComponentImplHelper < XSessionManagerClient, css::lang::XServiceInfo > { struct Listener { @@ -100,7 +98,7 @@ class VCLSession: return {"com.sun.star.frame.SessionManagerClient"}; } - void SAL_CALL disposing() override; + void disposing(std::unique_lock<std::mutex>& rGuard) override; void callSaveRequested( bool bShutdown ); void callShutdownCancelled(); @@ -114,8 +112,7 @@ public: } VCLSession::VCLSession() - : WeakComponentImplHelper( m_aMutex ), - m_xSession( ImplGetSVData()->mpDefInst->CreateSalSession() ), + : m_xSession( ImplGetSVData()->mpDefInst->CreateSalSession() ), m_bInteractionRequested( false ), m_bInteractionGranted( false ), m_bInteractionDone( false ), @@ -133,7 +130,7 @@ void VCLSession::callSaveRequested( bool bShutdown ) std::vector< Listener > aListeners; { - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); // reset listener states for (auto & listener : m_aListeners) { listener.m_bSaveDone = listener.m_bInteractionRequested = listener.m_bInteractionDone = false; @@ -172,7 +169,7 @@ void VCLSession::callInteractionGranted( bool bInteractionGranted ) std::vector< Listener > aListeners; { - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); // copy listener vector since calling a listener may remove it. for (auto const & listener: m_aListeners) if( listener.m_bInteractionRequested ) @@ -204,7 +201,7 @@ void VCLSession::callShutdownCancelled() std::vector< Listener > aListeners; { - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); // copy listener vector since calling a listener may remove it. aListeners = m_aListeners; // set back interaction state @@ -222,7 +219,7 @@ void VCLSession::callQuit() std::vector< Listener > aListeners; { - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); // copy listener vector since calling a listener may remove it. aListeners = m_aListeners; // set back interaction state @@ -274,7 +271,7 @@ void SAL_CALL VCLSession::addSessionManagerListener( const css::uno::Reference<X { SAL_INFO("vcl.se", "VCLSession::addSessionManagerListener" ); - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); SAL_INFO("vcl.se.debug", " m_aListeners.size() = " << m_aListeners.size() ); m_aListeners.emplace_back( xListener ); @@ -284,7 +281,7 @@ void SAL_CALL VCLSession::removeSessionManagerListener( const css::uno::Referenc { SAL_INFO("vcl.se", "VCLSession::removeSessionManagerListener" ); - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); SAL_INFO("vcl.se.debug", " m_aListeners.size() = " << m_aListeners.size() ); @@ -306,7 +303,7 @@ void SAL_CALL VCLSession::queryInteraction( const css::uno::Reference<XSessionMa return; } - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); if( ! m_bInteractionRequested ) { if (m_xSession) @@ -329,7 +326,7 @@ void SAL_CALL VCLSession::interactionDone( const css::uno::Reference< XSessionMa { SAL_INFO("vcl.se", "VCLSession::interactionDone"); - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); int nRequested = 0, nDone = 0; for (auto & listener: m_aListeners) { @@ -357,7 +354,7 @@ void SAL_CALL VCLSession::saveDone( const css::uno::Reference< XSessionManagerLi { SAL_INFO("vcl.se", "VCLSession::saveDone"); - osl::MutexGuard aGuard( m_aMutex ); + std::unique_lock aGuard( m_aMutex ); bool bSaveDone = true; for (auto & listener: m_aListeners) @@ -385,22 +382,23 @@ sal_Bool SAL_CALL VCLSession::cancelShutdown() return m_xSession && m_xSession->cancelShutdown(); } -void VCLSession::disposing() { +void VCLSession::disposing(std::unique_lock<std::mutex>& rGuard) { SAL_INFO("vcl.se", "VCLSession::disposing"); std::vector<Listener> vector; { - osl::MutexGuard g(m_aMutex); vector.swap(m_aListeners); } css::lang::EventObject src(getXWeak()); for (auto const & listener: vector) { + rGuard.unlock(); try { listener.m_xListener->disposing(src); SAL_INFO("vcl.se.debug", " call Listener disposing"); } catch (css::uno::RuntimeException &) { TOOLS_WARN_EXCEPTION("vcl.se", "ignoring"); } + rGuard.lock(); } } commit d547ad77555fc0dce5ecf3c55b44f5ce7eade7cd Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Mar 27 14:35:55 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Mar 29 07:41:58 2024 +0100 convert NameContainer to comphelper::WeakImplHelper Change-Id: If89ee5bf200affc04704b7f075f25cbf599c1e62 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165494 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx index 9973ab94e815..4db38ac881a4 100644 --- a/basic/source/inc/namecont.hxx +++ b/basic/source/inc/namecont.hxx @@ -51,19 +51,20 @@ #include <cppuhelper/basemutex.hxx> #include <rtl/ref.hxx> #include <comphelper/interfacecontainer3.hxx> +#include <comphelper/interfacecontainer4.hxx> #include <xmlscript/xmllib_imexp.hxx> class BasicManager; namespace basic { -typedef ::cppu::WeakImplHelper< +typedef ::comphelper::WeakImplHelper< css::container::XNameContainer, css::container::XContainer, css::util::XChangesNotifier > NameContainer_BASE; -class NameContainer final : public ::cppu::BaseMutex, public NameContainer_BASE +class NameContainer final : public NameContainer_BASE { typedef std::unordered_map < OUString, sal_Int32 > NameContainerNameMap; @@ -75,16 +76,14 @@ class NameContainer final : public ::cppu::BaseMutex, public NameContainer_BASE css::uno::Type mType; css::uno::XInterface* mpxEventSource; - ::comphelper::OInterfaceContainerHelper3<css::container::XContainerListener> maContainerListeners; - ::comphelper::OInterfaceContainerHelper3<css::util::XChangesListener> maChangesListeners; + ::comphelper::OInterfaceContainerHelper4<css::container::XContainerListener> maContainerListeners; + ::comphelper::OInterfaceContainerHelper4<css::util::XChangesListener> maChangesListeners; public: NameContainer( const css::uno::Type& rType ) : mnElementCount( 0 ) , mType( rType ) , mpxEventSource( nullptr ) - , maContainerListeners( m_aMutex ) - , maChangesListeners( m_aMutex ) {} void setEventSource( css::uno::XInterface* pxEventSource ) diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index 430cab8b3264..2d1dea85fc67 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -156,27 +156,29 @@ void NameContainer::replaceByName( const OUString& aName, const Any& aElement ) mValues[ iHashResult ] = aElement; + std::unique_lock aGuard(m_aMutex); + // Fire event - if( maContainerListeners.getLength() > 0 ) + if( maContainerListeners.getLength(aGuard) > 0 ) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aElement; aEvent.ReplacedElement = aOldElement; - maContainerListeners.notifyEach( &XContainerListener::elementReplaced, aEvent ); + maContainerListeners.notifyEach( aGuard, &XContainerListener::elementReplaced, aEvent ); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength() > 0 ) + if( maChangesListeners.getLength(aGuard) > 0 ) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Base <<= aEvent.Source; aEvent.Changes = { { Any(aName), aElement, aOldElement } }; - maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); } } @@ -205,26 +207,28 @@ void NameContainer::insertNoCheck(const OUString& aName, const Any& aElement) mHashMap[ aName ] = nCount; mnElementCount++; + std::unique_lock aGuard(m_aMutex); + // Fire event - if( maContainerListeners.getLength() > 0 ) + if( maContainerListeners.getLength(aGuard) > 0 ) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aElement; - maContainerListeners.notifyEach( &XContainerListener::elementInserted, aEvent ); + maContainerListeners.notifyEach( aGuard, &XContainerListener::elementInserted, aEvent ); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength() > 0 ) + if( maChangesListeners.getLength(aGuard) > 0 ) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Base <<= aEvent.Source; aEvent.Changes = { { Any(aName), aElement, {} } }; - maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); } } @@ -257,20 +261,22 @@ void NameContainer::removeByName( const OUString& aName ) mValues.resize( iLast ); mnElementCount--; + std::unique_lock aGuard(m_aMutex); + // Fire event - if( maContainerListeners.getLength() > 0 ) + if( maContainerListeners.getLength(aGuard) > 0 ) { ContainerEvent aEvent; aEvent.Source = mpxEventSource; aEvent.Accessor <<= aName; aEvent.Element = aOldElement; - maContainerListeners.notifyEach( &XContainerListener::elementRemoved, aEvent ); + maContainerListeners.notifyEach( aGuard, &XContainerListener::elementRemoved, aEvent ); } /* After the container event has been fired (one listener will update the core Basic manager), fire change event. Listeners can rely on that the Basic source code of the core Basic manager is up-to-date. */ - if( maChangesListeners.getLength() > 0 ) + if( maChangesListeners.getLength(aGuard) > 0 ) { ChangesEvent aEvent; aEvent.Source = mpxEventSource; @@ -278,7 +284,7 @@ void NameContainer::removeByName( const OUString& aName ) aEvent.Changes = { { Any(aName), {}, // Element remains empty (meaning "replaced with nothing") aOldElement } }; - maChangesListeners.notifyEach( &XChangesListener::changesOccurred, aEvent ); + maChangesListeners.notifyEach( aGuard, &XChangesListener::changesOccurred, aEvent ); } } @@ -290,7 +296,8 @@ void SAL_CALL NameContainer::addContainerListener( const Reference< XContainerLi { throw RuntimeException("addContainerListener called with null xListener",getXWeak()); } - maContainerListeners.addInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maContainerListeners.addInterface( aGuard, xListener ); } void SAL_CALL NameContainer::removeContainerListener( const Reference< XContainerListener >& xListener ) @@ -299,7 +306,8 @@ void SAL_CALL NameContainer::removeContainerListener( const Reference< XContaine { throw RuntimeException("removeContainerListener called with null xListener",getXWeak()); } - maContainerListeners.removeInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maContainerListeners.removeInterface( aGuard, xListener ); } // Methods XChangesNotifier @@ -309,7 +317,8 @@ void SAL_CALL NameContainer::addChangesListener( const Reference< XChangesListen { throw RuntimeException("addChangesListener called with null xListener",getXWeak()); } - maChangesListeners.addInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maChangesListeners.addInterface( aGuard, xListener ); } void SAL_CALL NameContainer::removeChangesListener( const Reference< XChangesListener >& xListener ) @@ -318,7 +327,8 @@ void SAL_CALL NameContainer::removeChangesListener( const Reference< XChangesLis { throw RuntimeException("removeChangesListener called with null xListener",getXWeak()); } - maChangesListeners.removeInterface( xListener ); + std::unique_lock aGuard(m_aMutex); + maChangesListeners.removeInterface( aGuard, xListener ); }