vcl/win/dtrans/clipboardmanager.cxx  |   85 ++++++++++++++---------------------
 vcl/win/dtrans/clipboardmanager.hxx  |    7 +-
 vcl/win/dtrans/generic_clipboard.cxx |   40 ++++++----------
 vcl/win/dtrans/generic_clipboard.hxx |    6 +-
 4 files changed, 55 insertions(+), 83 deletions(-)

New commits:
commit be1c0c195166bb4d4056196599d88c864b42600b
Author:     Noel Grandin <noelgran...@collabora.co.uk>
AuthorDate: Fri Mar 10 15:59:09 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sun Mar 12 07:00:12 2023 +0000

    osl::Mutex->std::mutex in dtrans::GenericClipboard
    
    Change-Id: I5a4bbb9a445ec73422bca167ca658550eac26b7b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148638
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/vcl/win/dtrans/generic_clipboard.cxx 
b/vcl/win/dtrans/generic_clipboard.cxx
index a614a6808c37..fd822f091e7e 100644
--- a/vcl/win/dtrans/generic_clipboard.cxx
+++ b/vcl/win/dtrans/generic_clipboard.cxx
@@ -22,6 +22,7 @@
 #include <com/sun/star/datatransfer/clipboard/RenderingCapabilities.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
 #include <cppuhelper/supportsservice.hxx>
+#include <osl/diagnose.h>
 
 using namespace com::sun::star::datatransfer;
 using namespace com::sun::star::datatransfer::clipboard;
@@ -33,7 +34,6 @@ using namespace osl;
 using ::dtrans::GenericClipboard;
 
 GenericClipboard::GenericClipboard() :
-    WeakComponentImplHelper< XClipboardEx, XClipboardNotifier, XServiceInfo, 
XInitialization > (m_aMutex),
     m_bInitialized(false)
 {
 }
@@ -72,7 +72,7 @@ Sequence< OUString > SAL_CALL 
GenericClipboard::getSupportedServiceNames(    )
 
 Reference< XTransferable > SAL_CALL GenericClipboard::getContents()
 {
-    MutexGuard aGuard(m_aMutex);
+    std::unique_lock aGuard(m_aMutex);
     return m_aContents;
 }
 
@@ -80,7 +80,7 @@ void SAL_CALL GenericClipboard::setContents(const Reference< 
XTransferable >& xT
                                       const Reference< XClipboardOwner >& 
xClipboardOwner )
 {
     // remember old values for callbacks before setting the new ones.
-    ClearableMutexGuard aGuard(m_aMutex);
+    std::unique_lock aGuard(m_aMutex);
 
     Reference< XClipboardOwner > oldOwner(m_aOwner);
     m_aOwner = xClipboardOwner;
@@ -88,25 +88,16 @@ void SAL_CALL GenericClipboard::setContents(const 
Reference< XTransferable >& xT
     Reference< XTransferable > oldContents(m_aContents);
     m_aContents = xTrans;
 
-    aGuard.clear();
+    aGuard.unlock();
 
     // notify old owner on loss of ownership
     if( oldOwner.is() )
         oldOwner->lostOwnership(static_cast < XClipboard * > (this), 
oldContents);
 
     // notify all listeners on content changes
-    OInterfaceContainerHelper *pContainer =
-        rBHelper.aLC.getContainer(cppu::UnoType<XClipboardListener>::get());
-    if (pContainer)
-    {
-        ClipboardEvent aEvent(static_cast < XClipboard * > (this), 
m_aContents);
-        OInterfaceIteratorHelper aIterator(*pContainer);
-
-        while (aIterator.hasMoreElements())
-        {
-            
static_cast<XClipboardListener*>(aIterator.next())->changedContents(aEvent);
-        }
-    }
+    aGuard.lock();
+    ClipboardEvent aEvent(static_cast < XClipboard * > (this), m_aContents);
+    maClipboardListeners.notifyEach(aGuard, 
&XClipboardListener::changedContents, aEvent);
 }
 
 OUString SAL_CALL GenericClipboard::getName()
@@ -121,19 +112,18 @@ sal_Int8 SAL_CALL 
GenericClipboard::getRenderingCapabilities()
 
 void SAL_CALL GenericClipboard::addClipboardListener( const Reference< 
XClipboardListener >& listener )
 {
-    MutexGuard aGuard( rBHelper.rMutex );
-    OSL_ENSURE( !rBHelper.bInDispose, "do not add listeners in the dispose 
call" );
-    OSL_ENSURE( !rBHelper.bDisposed, "object is disposed" );
-    if (!rBHelper.bInDispose && !rBHelper.bDisposed)
-        rBHelper.aLC.addInterface( cppu::UnoType<XClipboardListener>::get(), 
listener );
+    std::unique_lock aGuard( m_aMutex );
+    OSL_ENSURE( !m_bDisposed, "object is disposed" );
+    if (!m_bDisposed)
+        maClipboardListeners.addInterface( aGuard, listener );
 }
 
 void SAL_CALL GenericClipboard::removeClipboardListener( const Reference< 
XClipboardListener >& listener )
 {
-    MutexGuard aGuard( rBHelper.rMutex );
-    OSL_ENSURE( !rBHelper.bDisposed, "object is disposed" );
-    if (!rBHelper.bInDispose && !rBHelper.bDisposed)
-        rBHelper.aLC.removeInterface( 
cppu::UnoType<XClipboardListener>::get(), listener );
+    std::unique_lock aGuard( m_aMutex );
+    OSL_ENSURE( !m_bDisposed, "object is disposed" );
+    if (!m_bDisposed)
+        maClipboardListeners.removeInterface( aGuard, listener );
 }
 
 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
diff --git a/vcl/win/dtrans/generic_clipboard.hxx 
b/vcl/win/dtrans/generic_clipboard.hxx
index 3c9126bcc535..cc1ad976b32b 100644
--- a/vcl/win/dtrans/generic_clipboard.hxx
+++ b/vcl/win/dtrans/generic_clipboard.hxx
@@ -19,7 +19,7 @@
 
 #pragma once
 
-#include <cppuhelper/compbase.hxx>
+#include <comphelper/compbase.hxx>
 
 #include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp>
 
@@ -31,17 +31,17 @@
 namespace dtrans
 {
 
-    class GenericClipboard : public ::cppu::WeakComponentImplHelper <
+    class GenericClipboard : public ::comphelper::WeakComponentImplHelper <
         css::datatransfer::clipboard::XClipboardEx,
         css::datatransfer::clipboard::XClipboardNotifier,
         css::lang::XServiceInfo,
         css::lang::XInitialization >
     {
-        ::osl::Mutex m_aMutex;
         OUString     m_aName;
 
         css::uno::Reference< css::datatransfer::XTransferable > m_aContents;
         css::uno::Reference< css::datatransfer::clipboard::XClipboardOwner > 
m_aOwner;
+        
comphelper::OInterfaceContainerHelper4<css::datatransfer::clipboard::XClipboardListener>
 maClipboardListeners;
 
         bool m_bInitialized;
         virtual ~GenericClipboard() override;
commit 5e05c18a44f9ae37d7119c7d9fd618a2e945dc72
Author:     Noel Grandin <noelgran...@collabora.co.uk>
AuthorDate: Fri Mar 10 16:09:30 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sun Mar 12 07:00:01 2023 +0000

    osl::Mutex->std::mutex in dtrans::ClipboardManager
    
    Change-Id: I94cf2557c8b3ddac111a606361647697c8852b20
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148639
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/vcl/win/dtrans/clipboardmanager.cxx 
b/vcl/win/dtrans/clipboardmanager.cxx
index 2e04d39e1457..82a1da85bd66 100644
--- a/vcl/win/dtrans/clipboardmanager.cxx
+++ b/vcl/win/dtrans/clipboardmanager.cxx
@@ -37,13 +37,12 @@ using namespace osl;
 
 using ::dtrans::ClipboardManager;
 
-static osl::Mutex g_InstanceGuard;
+static std::mutex g_InstanceGuard;
 static rtl::Reference<ClipboardManager> g_Instance;
 static bool g_Disposed = false;
 
 
 ClipboardManager::ClipboardManager():
-    WeakComponentImplHelper< XClipboardManager, XEventListener, XServiceInfo > 
(m_aMutex),
     m_aDefaultName(OUString("default"))
 {
 }
@@ -69,10 +68,10 @@ Sequence< OUString > SAL_CALL 
ClipboardManager::getSupportedServiceNames(  )
 
 Reference< XClipboard > SAL_CALL ClipboardManager::getClipboard( const 
OUString& aName )
 {
-    MutexGuard aGuard(m_aMutex);
+    std::unique_lock aGuard(m_aMutex);
 
     // object is disposed already
-    if (rBHelper.bDisposed)
+    if (m_bDisposed)
         throw DisposedException("object is disposed.",
                                 static_cast < XClipboardManager * > (this));
 
@@ -101,15 +100,15 @@ void SAL_CALL ClipboardManager::addClipboard( const 
Reference< XClipboard >& xCl
                                        static_cast < XClipboardManager * > 
(this), 1);
 
     // try to add new clipboard to the list
-    ClearableMutexGuard aGuard(m_aMutex);
-    if (!rBHelper.bDisposed && !rBHelper.bInDispose)
+    std::unique_lock aGuard(m_aMutex);
+    if (!m_bDisposed)
     {
         std::pair< const OUString, Reference< XClipboard > > value (
             aName.getLength() ? aName : m_aDefaultName,
             xClipboard );
 
         std::pair< ClipboardMap::iterator, bool > p = 
m_aClipboardMap.insert(value);
-        aGuard.clear();
+        aGuard.unlock();
 
         // insert failed, element must exist already
         if (!p.second)
@@ -124,70 +123,54 @@ void SAL_CALL ClipboardManager::addClipboard( const 
Reference< XClipboard >& xCl
 
 void SAL_CALL ClipboardManager::removeClipboard( const OUString& aName )
 {
-    MutexGuard aGuard(m_aMutex);
-    if (!rBHelper.bDisposed)
+    std::unique_lock aGuard(m_aMutex);
+    if (!m_bDisposed)
         m_aClipboardMap.erase(aName.getLength() ? aName : m_aDefaultName );
 }
 
 Sequence< OUString > SAL_CALL ClipboardManager::listClipboardNames()
 {
-    MutexGuard aGuard(m_aMutex);
+    std::unique_lock aGuard(m_aMutex);
 
-    if (rBHelper.bDisposed)
+    if (m_bDisposed)
         throw DisposedException("object is disposed.",
                                 static_cast < XClipboardManager * > (this));
 
-    if (rBHelper.bInDispose)
-        return Sequence< OUString > ();
-
     return comphelper::mapKeysToSequence(m_aClipboardMap);
 }
 
-void SAL_CALL ClipboardManager::dispose()
+void ClipboardManager::disposing(std::unique_lock<std::mutex>& rGuard)
 {
+    rGuard.unlock();
+
     {
-        osl::MutexGuard aGuard(g_InstanceGuard);
+        std::unique_lock aGuard(g_InstanceGuard);
         g_Instance.clear();
         g_Disposed = true;
     }
+
+    // removeClipboard is still allowed here,  so make a copy of the
+    // list (to ensure integrity) and clear the original.
+    rGuard.lock();
+    ClipboardMap aCopy;
+    std::swap(aCopy, m_aClipboardMap);
+    rGuard.unlock();
+
+    // dispose all clipboards still in list
+    for (auto const& elem : aCopy)
     {
-        ClearableMutexGuard aGuard( rBHelper.rMutex );
-        if (!rBHelper.bDisposed && !rBHelper.bInDispose)
+        Reference< XComponent > xComponent(elem.second, UNO_QUERY);
+        if (xComponent.is())
         {
-            rBHelper.bInDispose = true;
-            aGuard.clear();
-
-            // give everyone a chance to save his clipboard instance
-            EventObject aEvt(static_cast < XClipboardManager * > (this));
-            rBHelper.aLC.disposeAndClear( aEvt );
-
-            // removeClipboard is still allowed here,  so make a copy of the
-            // list (to ensure integrity) and clear the original.
-            ClearableMutexGuard aGuard2( rBHelper.rMutex );
-            ClipboardMap aCopy(m_aClipboardMap);
-            m_aClipboardMap.clear();
-            aGuard2.clear();
-
-            // dispose all clipboards still in list
-            for (auto const& elem : aCopy)
+            try
             {
-                Reference< XComponent > xComponent(elem.second, UNO_QUERY);
-                if (xComponent.is())
-                {
-                    try
-                    {
-                        xComponent->removeEventListener(static_cast < 
XEventListener * > (this));
-                        xComponent->dispose();
-                    }
-                    catch (const Exception&)
-                    {
-                        // exceptions can be safely ignored here.
-                    }
-                }
+                xComponent->removeEventListener(static_cast < XEventListener * 
> (this));
+                xComponent->dispose();
+            }
+            catch (const Exception&)
+            {
+                // exceptions can be safely ignored here.
             }
-
-            rBHelper.bDisposed = true;
-            rBHelper.bInDispose = false;
         }
     }
 }
@@ -204,7 +187,7 @@ extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
 dtrans_ClipboardManager_get_implementation(
     css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any> const&)
 {
-    osl::MutexGuard aGuard(g_InstanceGuard);
+    std::unique_lock aGuard(g_InstanceGuard);
     if (g_Disposed)
         return nullptr;
     if (!g_Instance)
diff --git a/vcl/win/dtrans/clipboardmanager.hxx 
b/vcl/win/dtrans/clipboardmanager.hxx
index 56e69617dc5f..27f9ddbdaee7 100644
--- a/vcl/win/dtrans/clipboardmanager.hxx
+++ b/vcl/win/dtrans/clipboardmanager.hxx
@@ -19,7 +19,7 @@
 
 #pragma once
 
-#include <cppuhelper/compbase.hxx>
+#include <comphelper/compbase.hxx>
 
 #include <com/sun/star/datatransfer/clipboard/XClipboardManager.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
@@ -32,13 +32,12 @@ typedef std::map< OUString, css::uno::Reference< 
css::datatransfer::clipboard::X
 namespace dtrans
 {
 
-    class ClipboardManager : public ::cppu::WeakComponentImplHelper <
+    class ClipboardManager : public ::comphelper::WeakComponentImplHelper <
       css::datatransfer::clipboard::XClipboardManager,
       css::lang::XEventListener,
       css::lang::XServiceInfo >
     {
         ClipboardMap m_aClipboardMap;
-        ::osl::Mutex m_aMutex;
 
         const OUString m_aDefaultName;
 
@@ -63,7 +62,7 @@ namespace dtrans
          * XComponent
          */
 
-        virtual void SAL_CALL dispose() override;
+        virtual void disposing(std::unique_lock<std::mutex>& rGuard) override;
 
         /*
          * XEventListener

Reply via email to