framework/inc/uielement/langselectionmenucontroller.hxx | 6 framework/inc/uielement/newmenucontroller.hxx | 6 framework/inc/uielement/toolbarsmenucontroller.hxx | 6 framework/source/uielement/controlmenucontroller.cxx | 21 +- framework/source/uielement/fontmenucontroller.cxx | 12 - framework/source/uielement/fontsizemenucontroller.cxx | 12 - framework/source/uielement/headermenucontroller.cxx | 12 - framework/source/uielement/langselectionmenucontroller.cxx | 14 - framework/source/uielement/macrosmenucontroller.cxx | 4 framework/source/uielement/newmenucontroller.cxx | 10 - framework/source/uielement/objectmenucontroller.cxx | 4 framework/source/uielement/recentfilesmenucontroller.cxx | 16 +- framework/source/uielement/resourcemenucontroller.cxx | 6 framework/source/uielement/toolbarmodemenucontroller.cxx | 10 - framework/source/uielement/toolbarsmenucontroller.cxx | 19 +- include/svtools/popupmenucontrollerbase.hxx | 16 -- svtools/source/uno/popupmenucontrollerbase.cxx | 96 ++++++------- 17 files changed, 128 insertions(+), 142 deletions(-)
New commits: commit 5032262fccd0ef7f274323ae481b3230ffd42d3a Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Tue Feb 21 15:05:37 2023 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Feb 22 13:24:47 2023 +0000 BaseMutex->std::mutex in PopupMenuControllerBase Change-Id: I26877ac7b6e5e39f511418d978199189c62cca6c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147416 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/framework/inc/uielement/langselectionmenucontroller.hxx b/framework/inc/uielement/langselectionmenucontroller.hxx index c27f42b56431..070054a2f4ac 100644 --- a/framework/inc/uielement/langselectionmenucontroller.hxx +++ b/framework/inc/uielement/langselectionmenucontroller.hxx @@ -44,9 +44,6 @@ namespace framework // XPopupMenuController virtual void SAL_CALL updatePopupMenu() override; - // XInitialization - virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; - // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override; @@ -54,6 +51,9 @@ namespace framework virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; private: + // XInitialization + virtual void initializeImpl( std::unique_lock<std::mutex>& rGuard, const css::uno::Sequence< css::uno::Any >& aArguments ) override; + virtual void impl_setPopupMenu() override; enum Mode { diff --git a/framework/inc/uielement/newmenucontroller.hxx b/framework/inc/uielement/newmenucontroller.hxx index 57e58239fc19..45b5e8f88696 100644 --- a/framework/inc/uielement/newmenucontroller.hxx +++ b/framework/inc/uielement/newmenucontroller.hxx @@ -40,9 +40,6 @@ namespace framework virtual sal_Bool SAL_CALL supportsService( const OUString& sServiceName ) override; virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; - // XInitialization - virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; - // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override; @@ -54,6 +51,9 @@ namespace framework virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; private: + // XInitialization + virtual void initializeImpl( std::unique_lock<std::mutex>& rGuard, const css::uno::Sequence< css::uno::Any >& aArguments ) override; + virtual void impl_setPopupMenu() override; void fillPopupMenu( css::uno::Reference< css::awt::XPopupMenu > const & rPopupMenu ); diff --git a/framework/inc/uielement/toolbarsmenucontroller.hxx b/framework/inc/uielement/toolbarsmenucontroller.hxx index 99d64775d6b6..48ae2eacd360 100644 --- a/framework/inc/uielement/toolbarsmenucontroller.hxx +++ b/framework/inc/uielement/toolbarsmenucontroller.hxx @@ -48,9 +48,6 @@ namespace framework // XPopupMenuController virtual void SAL_CALL setPopupMenu( const css::uno::Reference< css::awt::XPopupMenu >& PopupMenu ) override; - // XInitialization - virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; - // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override; @@ -71,6 +68,9 @@ namespace framework DECL_STATIC_LINK( ToolbarsMenuController, ExecuteHdl_Impl, void*, void ); private: + // XInitialization + virtual void initializeImpl( std::unique_lock<std::mutex>& rGuard, const css::uno::Sequence< css::uno::Any >& aArguments ) override; + void fillPopupMenu( css::uno::Reference< css::awt::XPopupMenu > const & rPopupMenu ); css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > getLayoutManagerToolbars( const css::uno::Reference< css::frame::XLayoutManager >& rLayoutManager ); css::uno::Reference< css::frame::XDispatch > getDispatchFromCommandURL( const OUString& rCommandURL ); diff --git a/framework/source/uielement/controlmenucontroller.cxx b/framework/source/uielement/controlmenucontroller.cxx index dec13831646f..b990e725d507 100644 --- a/framework/source/uielement/controlmenucontroller.cxx +++ b/framework/source/uielement/controlmenucontroller.cxx @@ -145,9 +145,6 @@ public: // XPopupMenuController virtual void SAL_CALL updatePopupMenu() override; - // XInitialization - virtual void SAL_CALL initialize( const uno::Sequence< uno::Any >& aArguments ) override; - // XStatusListener virtual void SAL_CALL statusChanged( const frame::FeatureStateEvent& Event ) override; @@ -158,6 +155,9 @@ public: virtual void SAL_CALL disposing( const lang::EventObject& Source ) override; private: + // XInitialization + virtual void initializeImpl( std::unique_lock<std::mutex>& rGuard, const uno::Sequence< uno::Any >& aArguments ) override; + class UrlToDispatchMap : public std::unordered_map< OUString, uno::Reference< frame::XDispatch > > { @@ -228,7 +228,7 @@ void SAL_CALL ControlMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); @@ -240,7 +240,7 @@ void SAL_CALL ControlMenuController::disposing( const EventObject& ) // XStatusListener void SAL_CALL ControlMenuController::statusChanged( const FeatureStateEvent& Event ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); if (!m_xPopupMenu) return; @@ -264,7 +264,7 @@ void SAL_CALL ControlMenuController::statusChanged( const FeatureStateEvent& Eve // XMenuListener void SAL_CALL ControlMenuController::itemActivated( const css::awt::MenuEvent& ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); SolarMutexGuard aSolarMutexGuard; @@ -282,9 +282,9 @@ void SAL_CALL ControlMenuController::itemActivated( const css::awt::MenuEvent& ) // XPopupMenuController void SAL_CALL ControlMenuController::updatePopupMenu() { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); if ( !(m_xFrame.is() && m_xPopupMenu.is()) ) return; @@ -310,10 +310,9 @@ void SAL_CALL ControlMenuController::updatePopupMenu() } // XInitialization -void SAL_CALL ControlMenuController::initialize( const Sequence< Any >& aArguments ) +void ControlMenuController::initializeImpl( std::unique_lock<std::mutex>& rGuard, const Sequence< Any >& aArguments ) { - osl::MutexGuard aLock( m_aMutex ); - svt::PopupMenuControllerBase::initialize(aArguments); + svt::PopupMenuControllerBase::initializeImpl(rGuard, aArguments); m_aBaseURL.clear(); } diff --git a/framework/source/uielement/fontmenucontroller.cxx b/framework/source/uielement/fontmenucontroller.cxx index e25b5b210b83..6dec522a3869 100644 --- a/framework/source/uielement/fontmenucontroller.cxx +++ b/framework/source/uielement/fontmenucontroller.cxx @@ -111,7 +111,7 @@ void SAL_CALL FontMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xFontListDispatch.clear(); @@ -129,12 +129,12 @@ void SAL_CALL FontMenuController::statusChanged( const FeatureStateEvent& Event if ( Event.State >>= aFontDescriptor ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_aFontFamilyName = aFontDescriptor.Name; } else if ( Event.State >>= aFontNameSeq ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); if ( m_xPopupMenu.is() ) fillPopupMenu( aFontNameSeq, m_xPopupMenu ); } @@ -143,7 +143,7 @@ void SAL_CALL FontMenuController::statusChanged( const FeatureStateEvent& Event // XMenuListener void SAL_CALL FontMenuController::itemActivated( const css::awt::MenuEvent& ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); if ( !m_xPopupMenu.is() ) return; @@ -193,12 +193,12 @@ void SAL_CALL FontMenuController::updatePopupMenu() { svt::PopupMenuControllerBase::updatePopupMenu(); - osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); Reference< XDispatch > xDispatch( m_xFontListDispatch ); css::util::URL aTargetURL; aTargetURL.Complete = ".uno:FontNameList"; m_xURLTransformer->parseStrict( aTargetURL ); - aLock.clear(); + aLock.unlock(); if ( xDispatch.is() ) { diff --git a/framework/source/uielement/fontsizemenucontroller.cxx b/framework/source/uielement/fontsizemenucontroller.cxx index e050c1659eb6..bb81c23c284b 100644 --- a/framework/source/uielement/fontsizemenucontroller.cxx +++ b/framework/source/uielement/fontsizemenucontroller.cxx @@ -208,7 +208,7 @@ void SAL_CALL FontSizeMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xCurrentFontDispatch.clear(); @@ -225,14 +225,14 @@ void SAL_CALL FontSizeMenuController::statusChanged( const FeatureStateEvent& Ev if ( Event.State >>= aFontDescriptor ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); if ( m_xPopupMenu.is() ) fillPopupMenu( m_xPopupMenu ); } else if ( Event.State >>= aFontHeight ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_aFontHeight = aFontHeight; if ( m_xPopupMenu.is() ) @@ -256,15 +256,15 @@ void FontSizeMenuController::impl_setPopupMenu() void SAL_CALL FontSizeMenuController::updatePopupMenu() { - osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); Reference< XDispatch > xDispatch( m_xCurrentFontDispatch ); css::util::URL aTargetURL; aTargetURL.Complete = ".uno:CharFontName"; m_xURLTransformer->parseStrict( aTargetURL ); - aLock.clear(); + aLock.unlock(); if ( xDispatch.is() ) { diff --git a/framework/source/uielement/headermenucontroller.cxx b/framework/source/uielement/headermenucontroller.cxx index 842e74559fac..f8c76fb8d8c1 100644 --- a/framework/source/uielement/headermenucontroller.cxx +++ b/framework/source/uielement/headermenucontroller.cxx @@ -185,7 +185,7 @@ void SAL_CALL HeaderMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); @@ -201,7 +201,7 @@ void SAL_CALL HeaderMenuController::statusChanged( const FeatureStateEvent& Even if ( Event.State >>= xModel ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xModel = xModel; if ( m_xPopupMenu.is() ) fillPopupMenu( xModel, m_xPopupMenu ); @@ -211,17 +211,17 @@ void SAL_CALL HeaderMenuController::statusChanged( const FeatureStateEvent& Even // XMenuListener void SAL_CALL HeaderMenuController::updatePopupMenu() { - osl::ResettableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); Reference< css::frame::XModel > xModel( m_xModel ); - aLock.clear(); + aLock.unlock(); if ( !xModel.is() ) svt::PopupMenuControllerBase::updatePopupMenu(); - aLock.reset(); + aLock.lock(); if ( m_xPopupMenu.is() && m_xModel.is() ) fillPopupMenu( m_xModel, m_xPopupMenu ); } diff --git a/framework/source/uielement/langselectionmenucontroller.cxx b/framework/source/uielement/langselectionmenucontroller.cxx index 51994c1021a0..4685afbea6a7 100644 --- a/framework/source/uielement/langselectionmenucontroller.cxx +++ b/framework/source/uielement/langselectionmenucontroller.cxx @@ -88,7 +88,7 @@ void SAL_CALL LanguageSelectionMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xLanguageDispatch.clear(); @@ -103,7 +103,7 @@ void SAL_CALL LanguageSelectionMenuController::statusChanged( const FeatureState { SolarMutexGuard aSolarMutexGuard; - if (rBHelper.bDisposed || rBHelper.bInDispose) + if (m_bDisposed) return; m_bShowMenu = true; @@ -233,12 +233,12 @@ void SAL_CALL LanguageSelectionMenuController::updatePopupMenu() svt::PopupMenuControllerBase::updatePopupMenu(); // Force status update to get information about the current languages - osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); Reference< XDispatch > xDispatch( m_xLanguageDispatch ); css::util::URL aTargetURL; aTargetURL.Complete = m_aLangStatusCommandURL; m_xURLTransformer->parseStrict( aTargetURL ); - aLock.clear(); + aLock.unlock(); if ( xDispatch.is() ) { @@ -263,14 +263,12 @@ void SAL_CALL LanguageSelectionMenuController::updatePopupMenu() } // XInitialization -void SAL_CALL LanguageSelectionMenuController::initialize( const Sequence< Any >& aArguments ) +void LanguageSelectionMenuController::initializeImpl( std::unique_lock<std::mutex>& rGuard, const Sequence< Any >& aArguments ) { - osl::MutexGuard aLock( m_aMutex ); - bool bInitialized( m_bInitialized ); if ( !bInitialized ) { - svt::PopupMenuControllerBase::initialize(aArguments); + svt::PopupMenuControllerBase::initializeImpl(rGuard, aArguments); if ( m_bInitialized ) { diff --git a/framework/source/uielement/macrosmenucontroller.cxx b/framework/source/uielement/macrosmenucontroller.cxx index b15b3191efe7..8a80d00c1861 100644 --- a/framework/source/uielement/macrosmenucontroller.cxx +++ b/framework/source/uielement/macrosmenucontroller.cxx @@ -95,7 +95,7 @@ void SAL_CALL MacrosMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xContext.clear(); @@ -110,7 +110,7 @@ void SAL_CALL MacrosMenuController::disposing( const EventObject& ) // XStatusListener void SAL_CALL MacrosMenuController::statusChanged( const FeatureStateEvent& ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); if ( m_xPopupMenu.is() ) { fillPopupMenu( m_xPopupMenu ); diff --git a/framework/source/uielement/newmenucontroller.cxx b/framework/source/uielement/newmenucontroller.cxx index 3e2260e3fae8..55c4d324801f 100644 --- a/framework/source/uielement/newmenucontroller.cxx +++ b/framework/source/uielement/newmenucontroller.cxx @@ -336,7 +336,7 @@ void SAL_CALL NewMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xContext.clear(); @@ -359,7 +359,7 @@ void SAL_CALL NewMenuController::itemSelected( const css::awt::MenuEvent& rEvent Reference< XComponentContext > xContext; { - osl::MutexGuard aLock(m_aMutex); + std::unique_lock aLock(m_aMutex); xPopupMenu = m_xPopupMenu; xContext = m_xContext; } @@ -435,15 +435,13 @@ void NewMenuController::impl_setPopupMenu() } // XInitialization -void SAL_CALL NewMenuController::initialize( const Sequence< Any >& aArguments ) +void NewMenuController::initializeImpl( std::unique_lock<std::mutex>& rGuard, const Sequence< Any >& aArguments ) { - osl::MutexGuard aLock( m_aMutex ); - bool bInitialized( m_bInitialized ); if ( bInitialized ) return; - svt::PopupMenuControllerBase::initialize( aArguments ); + svt::PopupMenuControllerBase::initializeImpl( rGuard, aArguments ); if ( m_bInitialized ) { diff --git a/framework/source/uielement/objectmenucontroller.cxx b/framework/source/uielement/objectmenucontroller.cxx index 7e9e056d4293..653a02d60a17 100644 --- a/framework/source/uielement/objectmenucontroller.cxx +++ b/framework/source/uielement/objectmenucontroller.cxx @@ -103,7 +103,7 @@ void SAL_CALL ObjectMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); @@ -118,7 +118,7 @@ void SAL_CALL ObjectMenuController::statusChanged( const FeatureStateEvent& Even Sequence < css::embed::VerbDescriptor > aVerbCommandSeq; if ( Event.State >>= aVerbCommandSeq ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); if ( m_xPopupMenu.is() ) fillPopupMenu( aVerbCommandSeq, m_xPopupMenu ); } diff --git a/framework/source/uielement/recentfilesmenucontroller.cxx b/framework/source/uielement/recentfilesmenucontroller.cxx index ef95d300058b..644fd2215780 100644 --- a/framework/source/uielement/recentfilesmenucontroller.cxx +++ b/framework/source/uielement/recentfilesmenucontroller.cxx @@ -331,7 +331,7 @@ void SAL_CALL RecentFilesMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); @@ -343,7 +343,7 @@ void SAL_CALL RecentFilesMenuController::disposing( const EventObject& ) // XStatusListener void SAL_CALL RecentFilesMenuController::statusChanged( const FeatureStateEvent& Event ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_bDisabled = !Event.IsEnabled; } @@ -352,7 +352,7 @@ void SAL_CALL RecentFilesMenuController::itemSelected( const css::awt::MenuEvent Reference< css::awt::XPopupMenu > xPopupMenu; { - osl::MutexGuard aLock(m_aMutex); + std::unique_lock aLock(m_aMutex); xPopupMenu = m_xPopupMenu; } @@ -384,7 +384,7 @@ void SAL_CALL RecentFilesMenuController::itemSelected( const css::awt::MenuEvent void SAL_CALL RecentFilesMenuController::itemActivated( const css::awt::MenuEvent& ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); impl_setPopupMenu(); } @@ -401,9 +401,9 @@ Reference< XDispatch > SAL_CALL RecentFilesMenuController::queryDispatch( const OUString& /*sTarget*/, sal_Int32 /*nFlags*/ ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); if ( aURL.Complete.startsWith( m_aBaseURL ) ) return Reference< XDispatch >( this ); @@ -416,9 +416,9 @@ void SAL_CALL RecentFilesMenuController::dispatch( const URL& aURL, const Sequence< PropertyValue >& /*seqProperties*/ ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); if ( !aURL.Complete.startsWith( m_aBaseURL ) ) return; diff --git a/framework/source/uielement/resourcemenucontroller.cxx b/framework/source/uielement/resourcemenucontroller.cxx index c1757895ee5b..065a97c63a47 100644 --- a/framework/source/uielement/resourcemenucontroller.cxx +++ b/framework/source/uielement/resourcemenucontroller.cxx @@ -77,7 +77,7 @@ private: css::uno::Reference< css::container::XIndexAccess > m_xMenuContainer; css::uno::Reference< css::ui::XUIConfigurationManager > m_xConfigManager, m_xModuleConfigManager; void addVerbs( const css::uno::Sequence< css::embed::VerbDescriptor >& rVerbs ); - virtual void SAL_CALL disposing() override; + virtual void disposing(std::unique_lock<std::mutex>& rGuard) override; protected: css::uno::Reference< css::uno::XComponentContext > m_xContext; @@ -325,7 +325,7 @@ void ResourceMenuController::disposing( const css::lang::EventObject& rEvent ) } } -void ResourceMenuController::disposing() +void ResourceMenuController::disposing(std::unique_lock<std::mutex>& rGuard) { css::uno::Reference< css::ui::XUIConfiguration > xConfig( m_xConfigManager, css::uno::UNO_QUERY ); if ( xConfig.is() ) @@ -348,7 +348,7 @@ void ResourceMenuController::disposing() m_xMenuBarManager.clear(); } - svt::PopupMenuControllerBase::disposing(); + svt::PopupMenuControllerBase::disposing(rGuard); } OUString ResourceMenuController::getImplementationName() diff --git a/framework/source/uielement/toolbarmodemenucontroller.cxx b/framework/source/uielement/toolbarmodemenucontroller.cxx index cf967788a5aa..62cfdc04dd41 100644 --- a/framework/source/uielement/toolbarmodemenucontroller.cxx +++ b/framework/source/uielement/toolbarmodemenucontroller.cxx @@ -157,7 +157,7 @@ void SAL_CALL ToolbarModeMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); @@ -172,9 +172,9 @@ void SAL_CALL ToolbarModeMenuController::statusChanged( const FeatureStateEvent& OUString aFeatureURL( Event.FeatureURL.Complete ); // All other status events will be processed here - osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); Reference< css::awt::XPopupMenu > xPopupMenu( m_xPopupMenu ); - aLock.clear(); + aLock.unlock(); if ( !xPopupMenu.is() ) return; @@ -268,9 +268,9 @@ void SAL_CALL ToolbarModeMenuController::itemActivated( const css::awt::MenuEven // XPopupMenuController void SAL_CALL ToolbarModeMenuController::setPopupMenu( const Reference< css::awt::XPopupMenu >& xPopupMenu ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); if ( m_xFrame.is() && !m_xPopupMenu.is() ) { diff --git a/framework/source/uielement/toolbarsmenucontroller.cxx b/framework/source/uielement/toolbarsmenucontroller.cxx index aa2ebd88d039..c4c8c3f73e1f 100644 --- a/framework/source/uielement/toolbarsmenucontroller.cxx +++ b/framework/source/uielement/toolbarsmenucontroller.cxx @@ -451,7 +451,7 @@ void SAL_CALL ToolbarsMenuController::disposing( const EventObject& ) { Reference< css::awt::XMenuListener > xHolder(this); - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xDocCfgMgr.clear(); @@ -469,9 +469,9 @@ void SAL_CALL ToolbarsMenuController::statusChanged( const FeatureStateEvent& Ev OUString aFeatureURL( Event.FeatureURL.Complete ); // All other status events will be processed here - osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); Reference< css::awt::XPopupMenu > xPopupMenu( m_xPopupMenu ); - aLock.clear(); + aLock.unlock(); if ( !xPopupMenu.is() ) return; @@ -519,7 +519,7 @@ void SAL_CALL ToolbarsMenuController::itemSelected( const css::awt::MenuEvent& r Reference< XNameAccess > xPersistentWindowState; { - osl::MutexGuard aLock(m_aMutex); + std::unique_lock aLock(m_aMutex); xPopupMenu = m_xPopupMenu; xContext = m_xContext; xURLTransformer = m_xURLTransformer; @@ -669,7 +669,7 @@ void SAL_CALL ToolbarsMenuController::itemActivated( const css::awt::MenuEvent& Reference< XDispatchProvider > xDispatchProvider( m_xFrame, UNO_QUERY ); Reference< XURLTransformer > xURLTransformer( m_xURLTransformer ); { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); fillPopupMenu( m_xPopupMenu ); aCmdVector = m_aCommandVector; } @@ -706,9 +706,9 @@ void SAL_CALL ToolbarsMenuController::itemActivated( const css::awt::MenuEvent& // XPopupMenuController void SAL_CALL ToolbarsMenuController::setPopupMenu( const Reference< css::awt::XPopupMenu >& xPopupMenu ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); if ( m_xFrame.is() && !m_xPopupMenu.is() ) { @@ -723,14 +723,13 @@ void SAL_CALL ToolbarsMenuController::setPopupMenu( const Reference< css::awt::X } // XInitialization -void SAL_CALL ToolbarsMenuController::initialize( const Sequence< Any >& aArguments ) +void ToolbarsMenuController::initializeImpl( std::unique_lock<std::mutex>& rGuard, const Sequence< Any >& aArguments ) { - osl::MutexGuard aLock( m_aMutex ); bool bInitialized( m_bInitialized ); if ( bInitialized ) return; - svt::PopupMenuControllerBase::initialize(aArguments); + svt::PopupMenuControllerBase::initializeImpl(rGuard, aArguments); if ( !m_bInitialized ) return; diff --git a/include/svtools/popupmenucontrollerbase.hxx b/include/svtools/popupmenucontrollerbase.hxx index 7f34ac2e02b5..c0a8b531acf6 100644 --- a/include/svtools/popupmenucontrollerbase.hxx +++ b/include/svtools/popupmenucontrollerbase.hxx @@ -30,8 +30,7 @@ #include <com/sun/star/frame/XPopupMenuController.hpp> #include <tools/link.hxx> -#include <cppuhelper/compbase.hxx> -#include <cppuhelper/basemutex.hxx> +#include <comphelper/compbase.hxx> #include <rtl/ref.hxx> #include <rtl/ustring.hxx> @@ -43,7 +42,7 @@ class VCLXPopupMenu; namespace svt { - typedef cppu::WeakComponentImplHelper< + typedef comphelper::WeakComponentImplHelper< css::lang::XServiceInfo , css::frame::XPopupMenuController , css::lang::XInitialization , @@ -52,8 +51,7 @@ namespace svt css::frame::XDispatchProvider , css::frame::XDispatch > PopupMenuControllerBaseType; - class UNLESS_MERGELIBS(SVT_DLLPUBLIC) PopupMenuControllerBase : protected ::cppu::BaseMutex, // Struct for right initialization of mutex member! Must be first of baseclasses. - public PopupMenuControllerBaseType + class UNLESS_MERGELIBS(SVT_DLLPUBLIC) PopupMenuControllerBase : public PopupMenuControllerBaseType { public: PopupMenuControllerBase( const css::uno::Reference< css::uno::XComponentContext >& xContext ); @@ -69,7 +67,7 @@ namespace svt virtual void SAL_CALL updatePopupMenu() override; // XInitialization - virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override; + virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override final; // XStatusListener virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override = 0; @@ -95,15 +93,14 @@ namespace svt void dispatchCommand( const OUString& sCommandURL, const css::uno::Sequence< css::beans::PropertyValue >& rArgs, const OUString& sTarget = OUString() ); protected: - /// @throws css::uno::RuntimeException - void throwIfDisposed(); + virtual void initializeImpl( std::unique_lock<std::mutex>& rGuard, const css::uno::Sequence< css::uno::Any >& aArguments ); /** helper method to cause statusChanged is called once for the given command url */ void updateCommand( const OUString& rCommandURL ); /** this function is called upon disposing the component */ - virtual void SAL_CALL disposing() override; + virtual void disposing(std::unique_lock<std::mutex>& rGuard) override; static void resetPopupMenu( css::uno::Reference< css::awt::XPopupMenu > const & rPopupMenu ); virtual void impl_setPopupMenu(); @@ -120,6 +117,7 @@ namespace svt css::uno::Reference< css::frame::XFrame > m_xFrame; css::uno::Reference< css::util::XURLTransformer > m_xURLTransformer; rtl::Reference< VCLXPopupMenu > m_xPopupMenu; + comphelper::OInterfaceContainerHelper4<XStatusListener> maStatusListeners; }; } diff --git a/svtools/source/uno/popupmenucontrollerbase.cxx b/svtools/source/uno/popupmenucontrollerbase.cxx index fe6ea88392b6..e74bbc32b655 100644 --- a/svtools/source/uno/popupmenucontrollerbase.cxx +++ b/svtools/source/uno/popupmenucontrollerbase.cxx @@ -56,8 +56,6 @@ struct PopupMenuControllerBaseDispatchInfo } PopupMenuControllerBase::PopupMenuControllerBase( const Reference< XComponentContext >& xContext ) : - ::cppu::BaseMutex(), - PopupMenuControllerBaseType(m_aMutex), m_bInitialized( false ) { if ( xContext.is() ) @@ -68,13 +66,6 @@ PopupMenuControllerBase::~PopupMenuControllerBase() { } -// protected function -void PopupMenuControllerBase::throwIfDisposed() -{ - if (rBHelper.bDisposed || rBHelper.bInDispose) - throw css::lang::DisposedException(); -} - // protected function void PopupMenuControllerBase::resetPopupMenu( css::uno::Reference< css::awt::XPopupMenu > const & rPopupMenu ) { @@ -84,10 +75,9 @@ void PopupMenuControllerBase::resetPopupMenu( css::uno::Reference< css::awt::XPo } } -void SAL_CALL PopupMenuControllerBase::disposing() +void PopupMenuControllerBase::disposing(std::unique_lock<std::mutex>& /*rGuard*/) { // Reset our members and set disposed flag - osl::MutexGuard aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xPopupMenu.clear(); @@ -102,7 +92,7 @@ sal_Bool SAL_CALL PopupMenuControllerBase::supportsService( const OUString& Serv // XEventListener void SAL_CALL PopupMenuControllerBase::disposing( const EventObject& ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); m_xFrame.clear(); m_xDispatch.clear(); m_xPopupMenu.clear(); @@ -115,9 +105,8 @@ void SAL_CALL PopupMenuControllerBase::itemHighlighted( const awt::MenuEvent& ) void SAL_CALL PopupMenuControllerBase::itemSelected( const awt::MenuEvent& rEvent ) { - throwIfDisposed(); - - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); + throwIfDisposed(aLock); if( m_xPopupMenu.is() ) { @@ -130,9 +119,9 @@ void PopupMenuControllerBase::dispatchCommand( const OUString& sCommandURL, const css::uno::Sequence< css::beans::PropertyValue >& rArgs, const OUString& sTarget ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); - throwIfDisposed(); + throwIfDisposed(aLock); try { @@ -170,8 +159,8 @@ void SAL_CALL PopupMenuControllerBase::itemDeactivated( const awt::MenuEvent& ) void SAL_CALL PopupMenuControllerBase::updatePopupMenu() { { - osl::MutexGuard aLock(m_aMutex); - throwIfDisposed(); + std::unique_lock aLock(m_aMutex); + throwIfDisposed(aLock); } updateCommand( m_aCommandURL ); @@ -179,13 +168,13 @@ void SAL_CALL PopupMenuControllerBase::updatePopupMenu() void PopupMenuControllerBase::updateCommand( const OUString& rCommandURL ) { - osl::ClearableMutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); Reference< XStatusListener > xStatusListener(this); Reference< XDispatch > xDispatch( m_xDispatch ); URL aTargetURL; aTargetURL.Complete = rCommandURL; m_xURLTransformer->parseStrict( aTargetURL ); - aLock.clear(); + aLock.unlock(); // Add/remove status listener to get a status update once if ( xDispatch.is() ) @@ -204,8 +193,8 @@ PopupMenuControllerBase::queryDispatch( sal_Int32 /*nFlags*/ ) { // must be implemented by subclass - osl::MutexGuard aLock( m_aMutex ); - throwIfDisposed(); + std::unique_lock aLock( m_aMutex ); + throwIfDisposed(aLock); return Reference< XDispatch >(); } @@ -215,8 +204,8 @@ Sequence< Reference< XDispatch > > SAL_CALL PopupMenuControllerBase::queryDispat // Create return list - which must have same size then the given descriptor // It's not allowed to pack it! { - osl::MutexGuard aLock(m_aMutex); - throwIfDisposed(); + std::unique_lock aLock(m_aMutex); + throwIfDisposed(aLock); } sal_Int32 nCount = lDescriptor.getLength(); @@ -237,8 +226,8 @@ PopupMenuControllerBase::dispatch( const Sequence< PropertyValue >& /*seqProperties*/ ) { // must be implemented by subclass - osl::MutexGuard aLock( m_aMutex ); - throwIfDisposed(); + std::unique_lock aLock( m_aMutex ); + throwIfDisposed(aLock); } void SAL_CALL @@ -246,17 +235,15 @@ PopupMenuControllerBase::addStatusListener( const Reference< XStatusListener >& xControl, const URL& aURL ) { - osl::ResettableMutexGuard aLock( m_aMutex ); - throwIfDisposed(); - aLock.clear(); + std::unique_lock aLock( m_aMutex ); + throwIfDisposed(aLock); bool bStatusUpdate( false ); - rBHelper.addListener( cppu::UnoType<decltype(xControl)>::get(), xControl ); + maStatusListeners.addInterface( aLock, xControl ); - aLock.reset(); if ( aURL.Complete.startsWith( m_aBaseURL ) ) bStatusUpdate = true; - aLock.clear(); + aLock.unlock(); if ( bStatusUpdate ) { @@ -274,7 +261,8 @@ void SAL_CALL PopupMenuControllerBase::removeStatusListener( const Reference< XStatusListener >& xControl, const URL& /*aURL*/ ) { - rBHelper.removeListener( cppu::UnoType<decltype(xControl)>::get(), xControl ); + std::unique_lock aLock( m_aMutex ); + maStatusListeners.removeInterface( aLock, xControl ); } OUString PopupMenuControllerBase::determineBaseURL( std::u16string_view aURL ) @@ -299,8 +287,13 @@ OUString PopupMenuControllerBase::determineBaseURL( std::u16string_view aURL ) // XInitialization void SAL_CALL PopupMenuControllerBase::initialize( const Sequence< Any >& aArguments ) { - osl::MutexGuard aLock( m_aMutex ); + std::unique_lock aLock( m_aMutex ); + initializeImpl(aLock, aArguments); +} +// XInitialization +void PopupMenuControllerBase::initializeImpl( std::unique_lock<std::mutex>& /*rGuard*/, const Sequence< Any >& aArguments ) +{ bool bInitialized( m_bInitialized ); if ( bInitialized ) return; @@ -333,28 +326,29 @@ void SAL_CALL PopupMenuControllerBase::initialize( const Sequence< Any >& aArgum // XPopupMenuController void SAL_CALL PopupMenuControllerBase::setPopupMenu( const Reference< awt::XPopupMenu >& xPopupMenu ) { - osl::MutexGuard aLock( m_aMutex ); - throwIfDisposed(); + { + std::unique_lock aLock( m_aMutex ); + throwIfDisposed(aLock); - if ( !m_xFrame.is() || m_xPopupMenu.is() ) - return; + if ( !m_xFrame.is() || m_xPopupMenu.is() ) + return; - // Create popup menu on demand - SolarMutexGuard aSolarMutexGuard; + // Create popup menu on demand + SolarMutexGuard aSolarMutexGuard; - m_xPopupMenu = dynamic_cast<VCLXPopupMenu*>(xPopupMenu.get()); - assert(bool(xPopupMenu) == bool(m_xPopupMenu) && "we only support VCLXPopupMenu"); - m_xPopupMenu->addMenuListener( Reference< awt::XMenuListener >(this) ); + m_xPopupMenu = dynamic_cast<VCLXPopupMenu*>(xPopupMenu.get()); + assert(bool(xPopupMenu) == bool(m_xPopupMenu) && "we only support VCLXPopupMenu"); + m_xPopupMenu->addMenuListener( Reference< awt::XMenuListener >(this) ); - Reference< XDispatchProvider > xDispatchProvider( m_xFrame, UNO_QUERY ); + Reference< XDispatchProvider > xDispatchProvider( m_xFrame, UNO_QUERY ); - URL aTargetURL; - aTargetURL.Complete = m_aCommandURL; - m_xURLTransformer->parseStrict( aTargetURL ); - m_xDispatch = xDispatchProvider->queryDispatch( aTargetURL, OUString(), 0 ); - - impl_setPopupMenu(); + URL aTargetURL; + aTargetURL.Complete = m_aCommandURL; + m_xURLTransformer->parseStrict( aTargetURL ); + m_xDispatch = xDispatchProvider->queryDispatch( aTargetURL, OUString(), 0 ); + impl_setPopupMenu(); + } updatePopupMenu(); } void PopupMenuControllerBase::impl_setPopupMenu()