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()

Reply via email to