diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-08-25 12:15:17 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-08-25 12:19:46 +0200 |
commit | 2df2b3df1e9f701f3f4d2d04ea48f5d66de63075 (patch) | |
tree | 0b297e55592c1c0fff284e4b2498b30b3970fdcc /client | |
parent | 7c7e3efff31a8c225bb7029d08675aa617635a95 (diff) | |
download | spice-2df2b3df1e9f701f3f4d2d04ea48f5d66de63075.tar.gz spice-2df2b3df1e9f701f3f4d2d04ea48f5d66de63075.tar.xz spice-2df2b3df1e9f701f3f4d2d04ea48f5d66de63075.zip |
client: Handle async errors from xshm setup
XShmAttach can fail asynchronously, so we need to check the
errors in the x error handler during the XSync.
Diffstat (limited to 'client')
-rw-r--r-- | client/x11/platform.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index f80f0dcf..8292d44f 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -109,6 +109,8 @@ static Atom utf8_atom; #ifdef USE_XRANDR_1_2 static bool clipboard_inited = false; #endif +static Bool handle_x_error = false; +static int x_error_code; class DefaultEventListener: public Platform::EventListener { public: @@ -219,6 +221,18 @@ Display* XPlatform::get_display() return x_display; } +static void handle_x_errors_start(void) +{ + handle_x_error = True; + x_error_code = 0; +} + +static int handle_x_errors_stop(void) +{ + handle_x_error = False; + return x_error_code; +} + bool XPlatform::is_x_shm_avail() { return x_shm_avail; @@ -277,9 +291,16 @@ XImage *XPlatform::create_x_shm_image(RedDrawable::Format format, goto err2; } + handle_x_errors_start(); + /* Ensure the xserver has attached the xshm segment */ XSync (XPlatform::get_display(), False); + if (handle_x_errors_stop()) { + x_shm_avail = false; + goto err2; + } + /* Mark segment as released so that it will be destroyed when the xserver releases the segment. This way we won't leak the segment if the client crashes. */ @@ -2493,6 +2514,13 @@ static int x_error_handler(Display* display, XErrorEvent* error_event) char request_str[256]; char number_str[32]; + if (handle_x_error) { + if (error_event->error_code) { + x_error_code = error_event->error_code; + } + return 0; + } + char* display_name = XDisplayString(display); XGetErrorText(display, error_event->error_code, error_str, sizeof(error_str)); |