Bug 551685 - Frequent freezes with Broadway
Summary: Frequent freezes with Broadway
Status: NEW
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 4.12   Edit
Hardware: PC Linux
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Platform-SWT-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-10-01 15:49 EDT by Mickael Istria CLA
Modified: 2019-10-14 17:33 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mickael Istria CLA 2019-10-01 15:49:01 EDT
I'm trying to run Eclipse IDE in GTK Broadway, using a local build of GTK (but no tweak that's not official).
I get some freeze (in the browser page) with Broadway pretty often, more frequently that with other GTK applications I tried.
I found that usually, when I see a freeze, I see this in the log
```
(Eclipse:7201): Gdk-WARNING **: 21:45:08.037: convert_selection not implemented
```

Amy idea about anything like:
* is it possible to avoid this warning, avoid invoking convert selection
* can it be fixed on SWT side
* can it be fixed on GTK side
...?
Comment 1 Mickael Istria CLA 2019-10-01 16:31:35 EDT
As pointed by Eric, it looks like https://gitlab.gnome.org/GNOME/gtk/issues/1630
And stacktraces when this happen all show
```
   java.lang.Thread.State: RUNNABLE
    at org.eclipse.swt.internal.gtk.GTK._gtk_main_do_event(Native Method)
    at org.eclipse.swt.internal.gtk.GTK.gtk_main_do_event(GTK.java:4154)
    at org.eclipse.swt.widgets.Display.eventProc(Display.java:1474)
    at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
    at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:1603)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4404)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1049)
```

This means something inside GTK w/ Broadway is either totally stuck, or take ages and freezes UI reaction in the meantime.
Comment 2 Mickael Istria CLA 2019-10-03 04:19:48 EDT
So I could get a trace from it

$ GDB_BACKEND=braodway ./eclipse &
# when it's frozen
$ gdb --pid <pid_of_java>
(gdb) thread 2
(gdb) bt
(gdb) thread 2
[Switching to thread 2 (Thread 0x7fb01bba0700 (LWP 19578))]
#0  0x00007fb01d3a95c7 in poll () from /lib64/libc.so.6
(gdb) bt
#0  0x00007fb01d3a95c7 in poll () at /lib64/libc.so.6
#1  0x00007fafed4720fd in g_socket_condition_timed_wait () at /lib64/libgio-2.0.so.0
#2  0x00007fafed47316f in  () at /lib64/libgio-2.0.so.0
#3  0x00007fafed45231e in g_input_stream_read () at /lib64/libgio-2.0.so.0
#4  0x00007fafed69c5c8 in read_some_input_blocking (server=0x7fb014354450) at gdkbroadway-server.c:242
#5  0x00007fafed69c5c8 in gdk_broadway_server_wait_for_reply (server=0x7fb014354450, serial=85)
    at gdkbroadway-server.c:372
#6  0x00007fafed69c969 in _gdk_broadway_server_query_mouse
    (server=0x7fb014354450, toplevel=toplevel@entry=0x7fb01bb9ce18, root_x=root_x@entry=0x7fb01bb9ce10, root_y=root_y@entry=0x7fb01bb9ce14, mask=mask@entry=0x7fb01bb9ce1c) at gdkbroadway-server.c:419
#7  0x00007fafed6968eb in gdk_broadway_device_query_state
    (mask=0x7fb01bb9cedc, win_y=0x7fb01bb9cee8, win_x=0x7fb01bb9cee0, root_y=0x0, root_x=0x0, child_window=0x7fb01bb9ce98, root_window=0x0, window=0x7fb015d156f0, device=<optimized out>) at gdkdevice-broadway.c:179
#8  0x00007fafed6968eb in gdk_broadway_device_query_state
    (device=<optimized out>, window=0x7fb015d156f0, root_window=0x0, child_window=0x7fb01bb9ce98, root_x=0x0, root_y=0x0, win_x=0x7fb01bb9cee0, win_y=0x7fb01bb9cee8, mask=0x7fb01bb9cedc) at gdkdevice-broadway.c:144
#9  0x00007fafed69af06 in gdk_window_broadway_get_device_state
    (mask=0x7fb01bb9cedc, y=0x7fb01bb9cee8, x=0x7fb01bb9cee0, device=0x7fb01434a000, window=0x7fb015d156f0)
    at gdkwindow-broadway.c:761
#10 0x00007fafed69af06 in gdk_window_broadway_get_device_state
    (window=0x7fb015d156f0, device=0x7fb01434a000, x=0x7fb01bb9cee0, y=0x7fb01bb9cee8, mask=0x7fb01bb9cedc)
    at gdkwindow-broadway.c:748
#11 0x00007fafed662468 in gdk_window_get_device_position_double
--Type <RET> for more, q to quit, c to continue without paging--
    (window=0x7fb015d156f0, device=0x7fb01434a000, x=x@entry=0x7fb01bb9cf30, y=y@entry=0x7fb01bb9cf38, mask=0x7fb0160c37e0) at gdkwindow.c:5048
#12 0x00007fafed6625ab in gdk_window_get_device_position
    (window=<optimized out>, device=<optimized out>, x=0x7fb015022980, y=0x7fb01439dd60, mask=<optimized out>) at gdkwindow.c:5099
#13 0x00007fafc0138b39 in Java_org_eclipse_swt_internal_gtk_GDK__1gdk_1window_1get_1device_1position ()
    at /home/mistria/sandbox/eclipse-rust-2019-09-R-incubation-linux-gtk-x86_64/eclipse/configuration/org.eclipse.osgi/321/0/.cp/libswt-pi3-gtk-4928r15.so

It seems like the faulty method is _gdk_broadway_server_query_mouse , I've tried another case of a freeze and got

#0  0x00007f0b304a45c7 in poll () at /lib64/libc.so.6
#1  0x00007f0b085730fd in g_socket_condition_timed_wait () at /lib64/libgio-2.0.so.0
#2  0x00007f0b0857416f in  () at /lib64/libgio-2.0.so.0
#3  0x00007f0b0855331e in g_input_stream_read () at /lib64/libgio-2.0.so.0
#4  0x00007f0b0879d5c8 in read_some_input_blocking (server=0x7f0b2833c450) at gdkbroadway-server.c:242
#5  0x00007f0b0879d5c8 in gdk_broadway_server_wait_for_reply (server=0x7f0b2833c450, serial=7060)
    at gdkbroadway-server.c:372
#6  0x00007f0b0879d8e6 in _gdk_broadway_server_sync (server=0x7f0b2833c450) at gdkbroadway-server.c:397
#7  0x00007f0b0848d996 in  () at /lib64/libgobject-2.0.so.0
#8  0x00007f0b084aa1c8 in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
#9  0x00007f0b084aa973 in g_signal_emit () at /lib64/libgobject-2.0.so.0
#10 0x00007f0b08758a1f in _gdk_frame_clock_emit_after_paint (frame_clock=<optimized out>)
    at gdkframeclock.c:649
#11 0x00007f0b08759312 in gdk_frame_clock_paint_idle (data=0x7f0b2838ef80) at gdkframeclockidle.c:458
#12 0x00007f0b08744519 in gdk_threads_dispatch (data=0x7f0b2a22a440) at gdk.c:777
#13 0x00007f0b083a6971 in  () at /lib64/libglib-2.0.so.0
#14 0x00007f0b083a5edd in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#15 0x00007f0b083a6270 in  () at /lib64/libglib-2.0.so.0
#16 0x00007f0b083a6313 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#17 0x00007f0a86df9201 in Java_org_eclipse_swt_internal_gtk_OS__1g_1main_1context_1iteration ()
    at /home/mistria/sandbox/eclipse-rust-2019-09-R-incubation-linux-gtk-x86_64/eclipse/configuration/org.eclipse.osgi/321/0/.cp/libswt-pi3-gtk-4928r15.so
Comment 3 Mickael Istria CLA 2019-10-03 05:08:44 EDT
Another frozen (or so slow) stack

#0  0x00007f412a8645c7 in poll () at /lib64/libc.so.6
#1  0x00007f40eea530fd in g_socket_condition_timed_wait () at /lib64/libgio-2.0.so.0
#2  0x00007f40eea5416f in  () at /lib64/libgio-2.0.so.0
#3  0x00007f40eea3331e in g_input_stream_read () at /lib64/libgio-2.0.so.0
#4  0x00007f40eec9a5c8 in read_some_input_blocking (server=0x7f4124354450) at gdkbroadway-server.c:242
#5  0x00007f40eec9a5c8 in gdk_broadway_server_wait_for_reply (server=0x7f4124354450, serial=42)
    at gdkbroadway-server.c:372
#6  0x00007f40eec9aa19 in _gdk_broadway_server_new_window
    (server=0x7f4124354450, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, is_temp=<optimized out>) at gdkbroadway-server.c:455
#7  0x00007f40eec99b60 in _gdk_broadway_display_create_window_impl
    (display=0x7f412433e810, window=0x7f412631a6c0, real_parent=<optimized out>, screen=0x7f4124343810, event_mask=<optimized out>, attributes=<optimized out>, attributes_mask=354) at gdkwindow-broadway.c:276
#8  0x00007f40eec613c6 in gdk_window_new
    (parent=parent@entry=0x7f4124346120, attributes=attributes@entry=0x7f4129057800, attributes_mask=354)
    at gdkwindow.c:1512
#9  0x00007f40eda2a4bc in gtk_window_realize (widget=0x7f4124e5ea60) at gtkwindow.c:7478
#10 0x00007f40ee96d742 in g_closure_invoke () at /lib64/libgobject-2.0.so.0
#11 0x00007f40ee981639 in  () at /lib64/libgobject-2.0.so.0
#12 0x00007f40ee98a34e in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
#13 0x00007f40ee98a973 in g_signal_emit () at /lib64/libgobject-2.0.so.0
#14 0x00007f40eda1b8e7 in gtk_widget_realize (widget=0x7f4124e5ea60) at gtkwidget.c:5516
#15 0x00007f40d1392499 in Java_org_eclipse_swt_internal_gtk_GTK__1gtk_1widget_1realize ()
Comment 4 Mickael Istria CLA 2019-10-03 05:21:37 EDT
and another, shorter, one:

#0  0x00007fd773c6b5c7 in poll () from /lib64/libc.so.6
(gdb) bt
#0  0x00007fd773c6b5c7 in poll () at /lib64/libc.so.6
#1  0x00007fd71cf81488 in Java_org_eclipse_swt_internal_gtk_OS_Call__JJII ()
    at /home/mistria/sandbox/eclipse-rust-2019-09-R-incubation-linux-gtk-x86_64/eclipse/configuration/org.eclipse.osgi/321/0/.cp/libswt-pi3-gtk-4928r15.so
Comment 5 Eric Williams CLA 2019-10-03 14:03:04 EDT
(In reply to Mickael Istria from comment #4)
> and another, shorter, one:
> 
> #0  0x00007fd773c6b5c7 in poll () from /lib64/libc.so.6
> (gdb) bt
> #0  0x00007fd773c6b5c7 in poll () at /lib64/libc.so.6
> #1  0x00007fd71cf81488 in Java_org_eclipse_swt_internal_gtk_OS_Call__JJII ()
>     at
> /home/mistria/sandbox/eclipse-rust-2019-09-R-incubation-linux-gtk-x86_64/
> eclipse/configuration/org.eclipse.osgi/321/0/.cp/libswt-pi3-gtk-4928r15.so

This one looks like it's calling a GTK method that is frozen, probably similar to the other ones.

In general, these traces look like something is missing/wrong with the Broadway implementation. If it were an SWT issue we'd likely see it in X11/Wayland as well.
Comment 6 Mickael Istria CLA 2019-10-03 16:51:44 EDT
What bugs me is that if I use a native app like gedit or gtk&-demo, I see freezes in less than 5% of cases, wile wis Eclipse IDE, I see freezewes in 100% of case, very early after startup.
Comment 7 Mickael Istria CLA 2019-10-08 05:43:44 EDT
I could see the clipboard related slowdown from time to time, but it does look like a different issue, and most freezes are not related.
I've enabled debug symbols and now get richer stacktraces of when I see a freeze:

$ jstack <pid_java>
"main" #1 prio=6 os_prio=0 cpu=11109.49ms elapsed=149.85s tid=0x00007f87d4012000 nid=0x2c runnable  [0x00007f87d9e2a000]
   java.lang.Thread.State: RUNNABLE
	at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
	at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:1603)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4404)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1049)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)

$ gdb --pid=<pid_java>
(gdb) thread 2
[Switching to thread 2 (Thread 0x7f87d9e2c700 (LWP 44))]
#0  0x00007f87db63fa1f in poll () from /lib64/libc.so.6
(gdb) bt
#0  0x00007f87db63fa1f in poll () at /lib64/libc.so.6
#1  0x00007f87875e944d in g_socket_condition_timed_wait () at /lib64/libgio-2.0.so.0
#2  0x00007f87875ea4bf in g_socket_receive_with_timeout () at /lib64/libgio-2.0.so.0
#3  0x00007f87875c47be in g_input_stream_read () at /lib64/libgio-2.0.so.0
#4  0x00007f878789e1b8 in read_some_input_blocking (server=0x7f87d434b820) at gdkbroadway-server.c:242
#5  gdk_broadway_server_wait_for_reply (server=0x7f87d434b820, serial=751) at gdkbroadway-server.c:372
#6  0x00007f878789e506 in _gdk_broadway_server_sync (server=0x7f87d434b820) at gdkbroadway-server.c:397
#7  0x00007f87874fe996 in _g_closure_invoke_va () at /lib64/libgobject-2.0.so.0
#8  0x00007f878751b228 in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
#9  0x00007f878751b9d3 in g_signal_emit () at /lib64/libgobject-2.0.so.0
#10 0x00007f87878522cf in _gdk_frame_clock_emit_after_paint (frame_clock=<optimized out>) at gdkframeclock.c:649
#11 0x00007f8787852c6e in gdk_frame_clock_paint_idle (data=<optimized out>) at gdkframeclockidle.c:458
#12 0x00007f878783d569 in gdk_threads_dispatch (data=0x7f87d44be680) at gdk.c:777
#13 0x00007f8787414fb1 in g_timeout_dispatch () at /lib64/libglib-2.0.so.0
#14 0x00007f87874144a0 in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#15 0x00007f8787414830 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#16 0x00007f87874148d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#17 0x00007f873f14e201 in Java_org_eclipse_swt_internal_gtk_OS__1g_1main_1context_1iteration () at /root/eclipse/configuration/org.eclipse.osgi/374/0/.cp/libswt-pi3-gtk-4928r15.so

$ gdb <pid_of_broadwayd>
(gdb) bt
#0  0x00007f4e8d1bda1f in poll () at /lib64/libc.so.6
#1  0x00007f4e8db2d44d in g_socket_condition_timed_wait () at /lib64/libgio-2.0.so.0
#2  0x00007f4e8db2e6ca in g_socket_send_with_blocking () at /lib64/libgio-2.0.so.0
#3  0x00007f4e8db1d09e in g_output_stream_write () at /lib64/libgio-2.0.so.0
#4  0x00007f4e8db1d1d4 in g_output_stream_write_all () at /lib64/libgio-2.0.so.0
#5  0x000000000040405f in send_reply (client=0x21d59b0, request=<optimized out>, reply=0x7ffc0a172d90, size=64, type=<optimized out>) at broadwayd.c:121
#6  0x00000000004045cb in broadway_events_got_input (message=<optimized out>, client_id=-1) at broadwayd.c:603
#7  0x0000000000405c82 in process_input_messages (server=server@entry=0x21cb870) at broadway-server.c:360
#8  0x0000000000405cdc in input_data_cb (stream=<optimized out>, input=0x21e4b00) at broadway-server.c:728
#9  0x00007f4e8d9564a0 in g_main_context_dispatch () at /lib64/libglib-2.0.so.0
#10 0x00007f4e8d956830 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#11 0x00007f4e8d956b23 in g_main_loop_run () at /lib64/libglib-2.0.so.0
#12 0x0000000000403c9b in main (argc=<optimized out>, argv=<optimized out>) at broadwayd.c:535
(gdb) info threads
  Id   Target Id                                  Frame 
* 1    Thread 0x7f4e8cc9f400 (LWP 12) "broadwayd" 0x00007f4e8d1bda1f in poll () from /lib64/libc.so.6
  2    Thread 0x7f4e8cc9d700 (LWP 19) "gmain"     0x00007f4e8d1bda1f in poll () from /lib64/libc.so.6
(gdb) thread 2
[Switching to thread 2 (Thread 0x7f4e8cc9d700 (LWP 19))]
#0  0x00007f4e8d1bda1f in poll () from /lib64/libc.so.6
(gdb) bt
#0  0x00007f4e8d1bda1f in poll () at /lib64/libc.so.6
#1  0x00007f4e8d95679e in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#2  0x00007f4e8d9568d3 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#3  0x00007f4e8d956921 in glib_worker_main () at /lib64/libglib-2.0.so.0
#4  0x00007f4e8d97ff52 in g_thread_proxy () at /lib64/libglib-2.0.so.0
#5  0x00007f4e8d0264e2 in start_thread () at /lib64/libpthread.so.0
#6  0x00007f4e8d1c8643 in clone () at /lib64/libc.so.6
Comment 8 Mickael Istria CLA 2019-10-14 17:33:12 EDT
It looks like this issue may come from the launcher: If I use `java -jar plugin/org.eclipse.equinox.launcher_*.jar`, I do not face any issue (so far).