<Swing Dev> RFR: [Regression] Switch of Gnome theme ends up in deadlocked UI
Jayashree Sk1
jayashreesk at in.ibm.com
Tue Aug 25 13:54:10 UTC 2020
Hello,
Please review the fix for the following issue:
https://bugs.openjdk.java.net/browse/JDK-8244088
The scenario is:
Every-time we tried to switch a Gnome theme, Java ended up n deadlocked UI.
This regression was introduced (by below patches) while Providing GTK3 support in Java
Java8: 8207322: Backport GTK3 support on Linux to 8u
JDK11 : 8145547: [AWT/Swing] Conditional support for GTK 3 on Linux
Here for GTK3's g_main_context_iteration they have included an extra lock which was causing a deadlock and also the JNDI corresponding module is defined using a single parameter causing the hang in XToolkit_waitForEvents
So the fix is in 2 parts:
1) In Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1switch_1theme () method we wrap the g_main_context_iteration (ie, gtk->flush_event_loop() ) with gdk_threads_enter/gdk_threads_exit while g_main_context_iteration itself takes care of locks.
-> Remove the extra lock
2) The definition of g_main_context_iteration in new “gtk3_interface.h” was wrongly written with a single parameter, like :
static gboolean (*fp_g_main_context_iteration)(GMainContext *context);
instead of https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-main-context-iteration
gboolean g_main_context_iteration (GMainContext *context,
gboolean may_block);
-> When the above definition was corrected, we stopped seeing the hang during polling.
The proposed changeset is:
--- old/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c 2020-08-25 16:57:34.000000000 +0530
+++ new/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c 2020-08-25 16:57:34.000000000 +0530
@@ -703,7 +703,7 @@
*/
static void flush_gtk_event_loop()
{
- while((*fp_g_main_context_iteration)(NULL));
+ while((*fp_g_main_context_iteration)(NULL, FALSE));
}
/*
--- old/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.h 2020-08-25 16:57:36.000000000 +0530
+++ new/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.h 2020-08-25 16:57:35.000000000 +0530
@@ -396,7 +396,7 @@
const gchar *first_property_name,
...);
-static gboolean (*fp_g_main_context_iteration)(GMainContext *context);
+static gboolean (*fp_g_main_context_iteration)(GMainContext *context, gboolean may_block);
static gboolean (*fp_g_str_has_prefix)(const gchar *str, const gchar *prefix);
static gchar** (*fp_g_strsplit)(const gchar *string, const gchar *delimiter,
gint max_tokens);
--- old/src/java.desktop/unix/native/libawt_xawt/awt/swing_GTKEngine.c 2020-08-25 16:57:37.000000000 +0530
+++ new/src/java.desktop/unix/native/libawt_xawt/awt/swing_GTKEngine.c 2020-08-25 16:57:37.000000000 +0530
@@ -346,10 +346,8 @@
JNIEXPORT void JNICALL Java_com_sun_java_swing_plaf_gtk_GTKEngine_native_1switch_1theme(
JNIEnv *env, jobject this)
{
- // Note that flush_gtk_event_loop takes care of locks (7053002)
- gtk->gdk_threads_enter();
+ // Note that gtk->flush_event_loop takes care of locks (7053002)
gtk->flush_event_loop();
- gtk->gdk_threads_leave();
}
/*
Thanks
Jay
More information about the swing-dev
mailing list