summaryrefslogtreecommitdiff
path: root/vcl/win
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@collabora.co.uk>2023-03-10 16:09:30 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2023-03-12 07:00:01 +0000
commit5e05c18a44f9ae37d7119c7d9fd618a2e945dc72 (patch)
tree3e30f44c6e1be2771a7bcb5de0f337de90ecfe16 /vcl/win
parent86ef24c5bdde4a283c1347ac385b1b537896db05 (diff)
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.grandin@collabora.co.uk>
Diffstat (limited to 'vcl/win')
-rw-r--r--vcl/win/dtrans/clipboardmanager.cxx85
-rw-r--r--vcl/win/dtrans/clipboardmanager.hxx7
2 files changed, 37 insertions, 55 deletions
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