tdf#101376 don't detach thread if it is the main thread on macOS

On macOS, many AWT classes do their work on the main thread
deep in native methods in the java.awt.* classes. The problem
is that Oracle's and OpenJDK's JVMs don't bracket their
"perform on main thread" native calls with "attach/detach
current thread" calls to the JVM.

Change-Id: I0859dc9e20f34bd0b43bb321898507764fd530fb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157985
Tested-by: Jenkins
Reviewed-by: Patrick Luby <plubius@neooffice.org>
This commit is contained in:
Patrick Luby 2023-10-14 21:13:26 -04:00
parent db0681effb
commit fc69d6b227
2 changed files with 21 additions and 0 deletions

View file

@ -31,4 +31,10 @@ $(eval $(call gb_Library_add_exception_objects,javavm,\
stoc/source/javavm/jvmargs \ stoc/source/javavm/jvmargs \
)) ))
ifeq ($(OS),MACOSX)
$(eval $(call gb_Library_use_system_darwin_frameworks,javavm,\
CoreFoundation \
))
endif
# vim:set noet sw=4 ts=4: # vim:set noet sw=4 ts=4:

View file

@ -79,6 +79,12 @@
#define TIMEZONE "MET" #define TIMEZONE "MET"
#endif #endif
#ifdef MACOSX
#include <premac.h>
#include <CoreFoundation/CoreFoundation.h>
#include <postmac.h>
#endif
/* Within this implementation of the com.sun.star.java.JavaVirtualMachine /* Within this implementation of the com.sun.star.java.JavaVirtualMachine
* service and com.sun.star.java.theJavaVirtualMachine singleton, the method * service and com.sun.star.java.theJavaVirtualMachine singleton, the method
* com.sun.star.java.XJavaVM.getJavaVM relies on the following: * com.sun.star.java.XJavaVM.getJavaVM relies on the following:
@ -459,6 +465,15 @@ public:
explicit DetachCurrentThread(JavaVM * jvm): m_jvm(jvm) {} explicit DetachCurrentThread(JavaVM * jvm): m_jvm(jvm) {}
~DetachCurrentThread() { ~DetachCurrentThread() {
#ifdef MACOSX
// tdf#101376 don't detach thread if it is the main thread on macOS
// On macOS, many AWT classes do their work on the main thread
// deep in native methods in the java.awt.* classes. The problem
// is that Oracle's and OpenJDK's JVMs don't bracket their
// "perform on main thread" native calls with "attach/detach
// current thread" calls to the JVM.
if (CFRunLoopGetCurrent() != CFRunLoopGetMain())
#endif
if (m_jvm->DetachCurrentThread() != 0) { if (m_jvm->DetachCurrentThread() != 0) {
OSL_ASSERT(false); OSL_ASSERT(false);
} }