From 1126515226b60630b3a0fd72c45258b230dfe8fd Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Sun, 24 May 2020 09:18:10 +0200 Subject: Try to blind-solve cppunittester hangs on Windows ... calling OleInitialize early in sal_main to initialize COM and concurrency. Seeing intermittent hangs in main thread in CAPNDataObject::GetData calling m_rIDataObjectOrg->GetData, and the inner stack waiting objects in the code doing apartment switching (I forgot to save a stack to paste unfortunately), I suspect that being related to incorrect concurrency model. OleInitialize docs [1] mention: Applications that use the following functionality must call OleInitialize before calling any other function in the COM library: * Clipboard * Drag and Drop * Object linking and embedding (OLE) * In-place activation ... Because OLE operations are not thread-safe, OleInitialize specifies the concurrency model as single-thread apartment. CoInitializeEx sets COINIT_MULTITHREADED by default, so possibly that might get called somewhere before clipboard/OLE code is called. I hope that this change would fix those hangs. [1] https://docs.microsoft.com/en-us/windows/win32/api/ole2/nf-ole2-oleinitialize Change-Id: I7213c9d6cb4bd0691a3ce355995157797d7db93f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94675 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- sal/Executable_cppunittester.mk | 4 ++++ sal/cppunittester/cppunittester.cxx | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) (limited to 'sal') diff --git a/sal/Executable_cppunittester.mk b/sal/Executable_cppunittester.mk index 3b9016783b80..65426e722240 100644 --- a/sal/Executable_cppunittester.mk +++ b/sal/Executable_cppunittester.mk @@ -28,6 +28,10 @@ $(eval $(call gb_Executable_add_exception_objects,cppunittester,\ sal/cppunittester/cppunittester \ )) +$(eval $(call gb_Executable_use_system_win32_libs,cppunittester,\ + ole32 \ +)) + ifeq ($(COM),MSC) $(eval $(call gb_Executable_add_ldflags,cppunittester,\ diff --git a/sal/cppunittester/cppunittester.cxx b/sal/cppunittester/cppunittester.cxx index a760ecf8ff41..1b3c518c4b21 100644 --- a/sal/cppunittester/cppunittester.cxx +++ b/sal/cppunittester/cppunittester.cxx @@ -18,10 +18,9 @@ */ #ifdef _WIN32 -#if !defined WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -#include +#include +#include +#include #endif #ifdef UNX @@ -389,6 +388,9 @@ SAL_IMPLEMENT_MAIN() _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG|_CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); #endif + + // Tests may use e.g. OLE or clipboard; initialize COM and appropriate concurrency early + OleInitialize(nullptr); #endif std::vector protectors; -- cgit