summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-08-25 12:15:17 +0200
committerAlexander Larsson <alexl@redhat.com>2010-08-25 12:19:46 +0200
commit2df2b3df1e9f701f3f4d2d04ea48f5d66de63075 (patch)
tree0b297e55592c1c0fff284e4b2498b30b3970fdcc /client
parent7c7e3efff31a8c225bb7029d08675aa617635a95 (diff)
downloadspice-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.cpp28
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));