Skip to content

x11: Trap XRandr errors when getting outputs during init and update

Marco Trevisan requested to merge 3v1n0/gtk:trap-bad-rr-errors into main

We may try to update the XRR outputs and Crtcs when they're changing in the server, and so we may get BadRROutput that we're currently not handling properly.

As per this, use traps and check whether we got errors, and if we did let's ignore the current output.

It's not required to call init_randr13() again because if we got errors it's very likely that there's a change coming that will be notified at next iteration during which we'll repeat the init actions.


This is similar to !4681 (merged) happening quite a lot when stress-testing the test mutter clients (example https://gitlab.gnome.org/3v1n0/mutter/-/jobs/2856615).

A trace we get for such bug is:

#0  _g_log_abort (breakpoint=1) at ../../glib/glib/gmessages.c:555
#1  g_log_writer_default (log_level=<optimized out>, fields=0x7ffeaa01de50, n_fields=6, user_data=0x0)
    at ../../glib/glib/gmessages.c:2812
#2  0x00007f286a54c561 in g_log_structured_array (n_fields=6, fields=0x7ffeaa01de50, log_level=G_LOG_LEVEL_ERROR)
    at ../../glib/glib/gmessages.c:1983
#3  g_log_structured_array (log_level=G_LOG_LEVEL_ERROR, fields=0x7ffeaa01de50, n_fields=6)
    at ../../glib/glib/gmessages.c:1956
#4  0x00007f286a54d133 in g_log_structured_standard (log_domain=log_domain@entry=0x7f286ae1421f "Gdk", 
    log_level=log_level@entry=G_LOG_LEVEL_ERROR, 
    file=file@entry=0x7f286ae1a898 "../../gtk/gdk/x11/gdkdisplay-x11.c", line=line@entry=0x7f286ae1a2ff "2467", 
    func=func@entry=0x7f286ae1af50 <__func__.4> "_gdk_x11_display_error_event", 
    message_format=message_format@entry=0x7f286adc09b5 "%s") at ../../glib/glib/gmessages.c:2040
#5  0x00007f286acf7eeb in _gdk_x11_display_error_event (display=display@entry=0x563f8ad101d0, 
    error=error@entry=0x7ffeaa01e4b0) at ../../gtk/gdk/x11/gdkdisplay-x11.c:2467
#6  0x00007f286ad13ba3 in gdk_x_error (error=0x7ffeaa01e4b0, xdisplay=0x563f8acfa1c0)
    at ../../gtk/gdk/x11/gdkmain-x11.c:219
#7  gdk_x_error (xdisplay=0x563f8acfa1c0, error=0x7ffeaa01e4b0) at ../../gtk/gdk/x11/gdkmain-x11.c:181
#8  0x00007f286a3ea974 in _XError (dpy=dpy@entry=0x563f8acfa1c0, rep=rep@entry=0x563f8ad83620)
    at /data/GNOME/xorg/lib/libX11/src/XlibInt.c:1503
#9  0x00007f286a3e7497 in handle_error (dpy=dpy@entry=0x563f8acfa1c0, err=0x563f8ad83620, 
    in_XReply=in_XReply@entry=1) at /data/GNOME/xorg/lib/libX11/src/xcb_io.c:211
#10 0x00007f286a3e8845 in _XReply (dpy=dpy@entry=0x563f8acfa1c0, rep=rep@entry=0x7ffeaa01e670, 
    extra=extra@entry=1, discard=discard@entry=0) at /data/GNOME/xorg/lib/libX11/src/xcb_io.c:798
#11 0x00007f28699f2157 in XRRGetOutputInfo (dpy=0x563f8acfa1c0, resources=resources@entry=0x563f8b243050, 
    output=output@entry=1441) at /media/M2/GNOME/xorg/lib/libXrandr/src/XrrOutput.c:57
#12 0x00007f286acfeb40 in init_randr13 (x11_screen=x11_screen@entry=0x563f8ad143c0)
    at ../../gtk/gdk/x11/gdkscreen-x11.c:688
#13 0x00007f286acff8d0 in init_multihead (screen=0x563f8ad143c0) at ../../gtk/gdk/x11/gdkscreen-x11.c:866
#14 init_multihead (screen=0x563f8ad143c0) at ../../gtk/gdk/x11/gdkscreen-x11.c:866
#15 process_monitors_change (screen=0x563f8ad143c0) at ../../gtk/gdk/x11/gdkscreen-x11.c:967
#16 _gdk_x11_screen_size_changed (screen=0x563f8ad143c0, event=event@entry=0x7ffeaa01ee20)
    at ../../gtk/gdk/x11/gdkscreen-x11.c:988
#17 0x00007f286acf9190 in gdk_x11_display_translate_event (translator=<optimized out>, display=0x563f8ad101d0, 
    xevent=0x7ffeaa01ee20) at ../../gtk/gdk/x11/gdkdisplay-x11.c:1042
#18 0x00007f286ad13242 in gdk_event_source_translate_event (xevent=0x7ffeaa01ee20, x11_display=0x563f8ad101d0)
    at ../../gtk/gdk/x11/gdkeventsource.c:289
#19 gdk_event_source_xevent (x11_display=x11_display@entry=0x563f8ad101d0, xevent=0x7ffeaa01ee20)
    at ../../gtk/gdk/x11/gdkeventsource.c:328
#20 0x00007f286acd4d79 in _gdk_marshal_BOOLEAN__POINTER (closure=0x563f8ad10020, return_value=0x7ffeaa01ea30, 
    n_param_values=<optimized out>, param_values=0x7ffeaa01eac0, invocation_hint=<optimized out>, 
    marshal_data=<optimized out>) at gdk/gdkmarshalers.c:258
#21 0x00007f286a644dd0 in g_closure_invoke (closure=closure@entry=0x563f8ad10020, return_value=0x7ffeaa01ea30, 
    n_param_values=n_param_values@entry=2, param_values=param_values@entry=0x7ffeaa01eac0, 
    invocation_hint=invocation_hint@entry=0x7ffeaa01ea10) at ../../glib/gobject/gclosure.c:832
#22 0x00007f286a65868e in signal_emit_unlocked_R (node=node@entry=0x7ffeaa01eb90, detail=detail@entry=0, 
    instance=instance@entry=0x563f8ad101d0, emission_return=emission_return@entry=0x7ffeaa01ec10, 
    instance_and_params=instance_and_params@entry=0x7ffeaa01eac0) at ../../glib/gobject/gsignal.c:4020
#23 0x00007f286a659651 in signal_emit_valist_unlocked (instance=instance@entry=0x563f8ad101d0, 
    signal_id=signal_id@entry=9, detail=<optimized out>, var_args=var_args@entry=0x7ffeaa01ecd8)
    at ../../glib/gobject/gsignal.c:3625
#24 0x00007f286a65f8fa in g_signal_emit_by_name (instance=instance@entry=0x563f8ad101d0, 
    detailed_signal=detailed_signal@entry=0x7f286ae1a24e "xevent") at ../../glib/gobject/gsignal.c:3716
#25 0x00007f286ad134c2 in _gdk_x11_display_queue_events (display=0x563f8ad101d0)
--Type <RET> for more, q to quit, c to continue without paging--
    at ../../gtk/gdk/x11/gdkeventsource.c:408
#26 0x00007f286ad258c4 in gdk_display_get_event (display=0x563f8ad101d0) at ../../gtk/gdk/gdkdisplay.c:462
#27 0x00007f286ad12efe in gdk_event_source_dispatch (source=<optimized out>, callback=<optimized out>, 
    user_data=<optimized out>) at ../../gtk/gdk/x11/gdkeventsource.c:425
#28 0x00007f286a541547 in g_main_dispatch (context=context@entry=0x563f8ad83560) at ../../glib/glib/gmain.c:3476
#29 0x00007f286a544487 in g_main_context_dispatch_unlocked (context=0x563f8ad83560)
    at ../../glib/glib/gmain.c:4286
#30 g_main_context_iterate_unlocked (context=0x563f8ad83560, block=block@entry=1, dispatch=dispatch@entry=1, 
    self=<optimized out>) at ../../glib/glib/gmain.c:4351
#31 0x00007f286a544d1f in g_main_loop_run (loop=0x563f8b2240e0) at ../../glib/glib/gmain.c:4553
#32 0x0000563f8979cf9f in main (argc=1, argv=0x7ffeaa01f1b8) at ../../mutter/src/frames/main.c:68

/cc @jadahl

Edited by Marco Trevisan

Merge request reports