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>
This commit is contained in:
parent
76a8746ea4
commit
974ea67a7c
3 changed files with 38 additions and 0 deletions
|
@ -102,6 +102,8 @@ class UITestLogger;
|
|||
#define SV_ICON_ID_DATABASE 12
|
||||
#define SV_ICON_ID_FORMULA 13
|
||||
|
||||
namespace com::sun::star::datatransfer::clipboard { class XClipboard; }
|
||||
|
||||
namespace vcl
|
||||
{
|
||||
class DisplayConnectionDispatch;
|
||||
|
@ -372,6 +374,10 @@ struct ImplSVData
|
|||
|
||||
css::uno::Reference<css::i18n::XCharacterClassification> m_xCharClass;
|
||||
|
||||
#if defined _WIN32
|
||||
css::uno::Reference<css::datatransfer::clipboard::XClipboard> m_xSystemClipboard;
|
||||
#endif
|
||||
|
||||
Link<LinkParamNone*,void> maDeInitHook;
|
||||
|
||||
// LOK & headless backend specific hooks
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue