[Spice-devel] [PATCH 1/2] Don't try xshm any more if it fails for a permanent reason

alexl at redhat.com alexl at redhat.com
Mon Aug 23 08:14:59 PDT 2010


From: Alexander Larsson <alexl at redhat.com>

This is copied from how Gtk+ detects Xshm failures.
---
 client/x11/platform.cpp |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index 3b9f4af..1b54bc3 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -242,22 +242,38 @@ XImage *XPlatform::create_x_shm_image(RedDrawable::Format format,
                             format == RedDrawable::A1 ? XYBitmap : ZPixmap,
                             NULL, shminfo, width, height);
     if (image == NULL) {
+	x_shm_avail = false;
         goto err1;
     }
 
     shminfo->shmid = shmget(IPC_PRIVATE, height * image->bytes_per_line,
                             IPC_CREAT | 0777);
     if (shminfo->shmid < 0) {
+        /* EINVAL indicates, most likely, that the segment we asked for
+         * is bigger than SHMMAX, so we don't treat it as a permanent
+         * error. ENOSPC and ENOMEM may also indicate this, but
+         * more likely are permanent errors.
+         */
+        if (errno != EINVAL) {
+            x_shm_avail = false;
+        }
         goto err2;
     }
 
     shminfo->shmaddr = (char *)shmat(shminfo->shmid, 0, 0);
     if (!shminfo->shmaddr) {
+        /* Failure in shmat is almost certainly permanent. Most likely error is
+         * EMFILE, which would mean that we've exceeded the per-process
+         * Shm segment limit.
+         */
+        x_shm_avail = false;
+
         goto err2;
     }
 
     shminfo->readOnly = False;
     if (!XShmAttach(XPlatform::get_display(), shminfo)) {
+        x_shm_avail = false;
         goto err2;
     }
 
-- 
1.7.2.1



More information about the Spice-devel mailing list