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