summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2020-01-10 17:23:44 +0100
committerStephan Bergmann <sbergman@redhat.com>2020-01-13 23:03:02 +0100
commit974ea67a7c345a8be98c5aaa59baf9b07959b708 (patch)
treef0d6b6b993e26764806e7e32b684ffd7466ac2db /vcl/source
parent76a8746ea40965547c3d0fd9d56a8649f26ef756 (diff)
tdf#129930: Dispose SystemClipboard service early enough
At least on Windows, the related CMtaOleClipboard::m_hClipboardChangedNotifierThread thread would otherwise still run during cppuhelper::ServiceManager::disposing (but could try to create other UNO services, which then throws a DeploymentException). (There is also a GetSystemPrimarySelection similar to GetSystemClipboard in include/vcl/transfer.hxx, which might or might not turn out to have a similar issue.) Change-Id: Ia64e708cf0578e3a127c1a56fbace577ecf4ee1f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86558 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/app/svmain.cxx9
-rw-r--r--vcl/source/treelist/transfer2.cxx23
2 files changed, 32 insertions, 0 deletions
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index ace085e89632..bfa5279ca4ca 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -484,6 +484,15 @@ void DeInitVCL()
pSVData->maCtrlData.mpDisclosureMinus.reset();
pSVData->mpDefaultWin.disposeAndClear();
+#if defined _WIN32
+ // See GetSystemClipboard (vcl/source/treelist/transfer2.cxx):
+ if (auto const comp = css::uno::Reference<css::lang::XComponent>(
+ pSVData->m_xSystemClipboard, css::uno::UNO_QUERY))
+ {
+ comp->dispose();
+ }
+#endif
+
#ifndef NDEBUG
DbgGUIDeInitSolarMutexCheck();
#endif
diff --git a/vcl/source/treelist/transfer2.cxx b/vcl/source/treelist/transfer2.cxx
index 0a6f7528b252..fbb4c2a82768 100644
--- a/vcl/source/treelist/transfer2.cxx
+++ b/vcl/source/treelist/transfer2.cxx
@@ -21,6 +21,7 @@
#include <osl/mutex.hxx>
#include <sot/exchange.hxx>
+#include <tools/debug.hxx>
#include <vcl/svapp.hxx>
#include <vcl/window.hxx>
#include <comphelper/processfactory.hxx>
@@ -32,6 +33,7 @@
#include <svl/urlbmk.hxx>
#include <vcl/transfer.hxx>
+#include <svdata.hxx>
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
@@ -462,6 +464,26 @@ void TransferDataContainer::DragFinished( sal_Int8 nDropAction )
Reference<XClipboard> GetSystemClipboard()
{
+ // On Windows, the css.datatransfer.clipboard.SystemClipboard UNO service is implemented as a
+ // single-instance service (sysdtrans_component_getFactory,
+ // dtrans/source/win32/clipb/wcbentry.cxx) that needs timely disposing to join a spawned thread
+ // (done in DeInitVCL, vcl/source/app/svmain.cxx), while on other platforms it is implemented as
+ // a mutli-instance service (ClipboardFactory, vcl/source/components/dtranscomp.cxx) so we
+ // should not hold on to a single instance here:
+#if defined _WIN32
+ DBG_TESTSOLARMUTEX();
+ auto const data = ImplGetSVData();
+ if (!data->m_xSystemClipboard.is())
+ {
+ try
+ {
+ data->m_xSystemClipboard = css::datatransfer::clipboard::SystemClipboard::create(
+ comphelper::getProcessComponentContext());
+ }
+ catch (DeploymentException const &) {}
+ }
+ return data->m_xSystemClipboard;
+#else
Reference<XClipboard> xClipboard;
try
{
@@ -470,6 +492,7 @@ Reference<XClipboard> GetSystemClipboard()
}
catch (DeploymentException const &) {}
return xClipboard;
+#endif
}
Reference<XClipboard> GetSystemPrimarySelection()