[Spice-commits] client/x11

Alexander Larsson alexl at kemper.freedesktop.org
Thu Sep 9 07:25:41 PDT 2010


 client/x11/platform.cpp |   10 ++++++++++
 1 file changed, 10 insertions(+)

New commits:
commit 4efeef330249819189a7a99e2dc65d2b3bc2f17b
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Wed Sep 1 20:04:52 2010 +0200

    spicec-x11: Fix going into a never ending loop upon xrandr event (#628573) (v2)
    
    When handling an xrandr event the event_listener->on_monitors_change()
    callback destroys and re-creates the monitor object(s) which results
    in the DynamicScreen or MultyMonconstructor being called, which triggers
    more xrandr events. This causes a never ending event handling loop making
    spicec hang, and eventually making the X-server crash as a backlog
    of events builds up and it oom's.
    
    This patches this by explictly processing the xrandr event caused
    by the constructor inside the constructor surrounded by the already
    present guard code against recursive xrandr events.

diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index 8292d44..cc1502b 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -778,6 +778,11 @@ DynamicScreen::DynamicScreen(Display* display, int screen, int& next_mon_id)
     platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
     XSelectInput(display, platform_win, StructureNotifyMask);
     XRRSelectInput(display, platform_win, RRScreenChangeNotifyMask);
+
+    Monitor::self_monitors_change++;
+    process_monitor_configure_events(platform_win);
+    Monitor::self_monitors_change--;
+
     XPlatform::set_win_proc(platform_win, root_win_proc);
     intern_clipboard_atoms();
     X_DEBUG_SYNC(display);
@@ -1046,6 +1051,11 @@ MultyMonScreen::MultyMonScreen(Display* display, int screen, int& next_mon_id)
     X_DEBUG_SYNC(get_display());
     intern_clipboard_atoms();
     XPlatform::set_win_proc(root_window, root_win_proc);
+
+    XMonitor::inc_change_ref();
+    process_monitor_configure_events(root_window);
+    XMonitor::dec_change_ref();
+
     X_DEBUG_SYNC(get_display());
     //
     //platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);


More information about the Spice-commits mailing list