drisw: Port the MIT-SHM check to XCB
authorAdam Jackson <ajax@redhat.com>
Wed, 12 Aug 2020 17:54:46 +0000 (13:54 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 17 Aug 2020 16:17:50 +0000 (16:17 +0000)
The old version isn't thread-safe, and xlib makes it unreasonably
difficult to write thread-safely.

Fixes: mesa/mesa#3398
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6294>

.gitlab-ci.yml
.gitlab-ci/container/x86_test-gl.sh
meson.build
src/glx/drisw_glx.c
src/glx/meson.build

index ed6dabce0baa2487ee24bad5c9751ee45eb7cccf..22c2ef57cb98bb6fbeae50a46690f05a339bf9ad 100644 (file)
@@ -294,7 +294,7 @@ x86_test-base:
 x86_test-gl:
   extends: .use-x86_test-base
   variables:
-    FDO_DISTRIBUTION_TAG: &x86_test-gl "2020-07-28-x86-2"
+    FDO_DISTRIBUTION_TAG: &x86_test-gl "2020-08-14-xcb-shm"
 
 # Debian 10 based x86 test image for VK
 x86_test-vk:
index d7672d9de877bad1d35f4d477287264e4524580d..aaed8ec14592fa964ce210c2b3a8fc08b9af38d7 100644 (file)
@@ -33,6 +33,7 @@ STABLE_EPHEMERAL=" \
       "
 
 apt-get install -y --no-remove \
+      libxcb-shm0 \
       $STABLE_EPHEMERAL
 
 
index db4f8fc551b82d3e8a025dd0d649a162f545cc65..2478753f2afac82f55a436b8a42cbeecf6da1a14 100644 (file)
@@ -1701,6 +1701,7 @@ dep_xcb_sync = null_dep
 dep_xcb_xfixes = null_dep
 dep_xshmfence = null_dep
 dep_xcb_xrandr = null_dep
+dep_xcb_shm = null_dep
 dep_xlib_xrandr = null_dep
 if with_platform_x11
   if with_glx == 'xlib' or with_glx == 'gallium-xlib'
@@ -1713,6 +1714,7 @@ if with_platform_x11
     dep_xdamage = dependency('xdamage', version : '>= 1.1')
     dep_xfixes = dependency('xfixes')
     dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1')
+    dep_xcb_shm = dependency('xcb-shm')
   endif
   if (with_any_vk or with_glx == 'dri' or with_egl or
        (with_gallium_vdpau or with_gallium_xvmc or with_gallium_va or
index 07ace2c82b1fb00dec47e728b8dad3f3b85bd27a..b282db8cf83f574b465b4d5b0db55e1680109517 100644 (file)
 
 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
 
+#include <xcb/xproto.h>
+#include <xcb/shm.h>
 #include <X11/Xlib.h>
+#include <X11/Xlib-xcb.h>
 #include "glxclient.h"
 #include <dlfcn.h>
 #include "dri_common.h"
@@ -823,27 +826,26 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions)
 static int
 check_xshm(Display *dpy)
 {
-   int (*old_handler)(Display *, XErrorEvent *);
-
+   xcb_connection_t *c = XGetXCBConnection(dpy);
+   xcb_void_cookie_t cookie;
+   xcb_generic_error_t *error;
+   int ret = True;
    int ignore;
-   XShmSegmentInfo info = { 0, };
 
    if (!XQueryExtension(dpy, "MIT-SHM", &xshm_opcode, &ignore, &ignore))
       return False;
 
-   old_handler = XSetErrorHandler(handle_xerror);
-   XShmDetach(dpy, &info);
-   XSync(dpy, False);
-   (void) XSetErrorHandler(old_handler);
-
-   /* BadRequest means we're a remote client. If we were local we'd
-    * expect BadValue since 'info' has an invalid segment name.
-    */
-   if (xshm_error == BadRequest)
-      return False;
+   cookie = xcb_shm_detach_checked(c, 0);
+   if ((error = xcb_request_check(c, cookie))) {
+      /* BadRequest means we're a remote client. If we were local we'd
+       * expect BadValue since 'info' has an invalid segment name.
+       */
+      if (error->error_code == BadRequest)
+         ret = False;
+      free(error);
+   }
 
-   xshm_error = 0;
-   return True;
+   return ret;
 }
 
 static struct glx_screen *
index bceed2f5fc7e05ccd98c257c55733b42e3098f39..d602bc14306ad5f298f8945fee896af1e3b2272c 100644 (file)
@@ -159,7 +159,7 @@ libgl = shared_library(
   dependencies : [
     dep_libdrm, dep_dl, dep_m, dep_thread, dep_x11, dep_xcb_glx, dep_xcb,
     dep_x11_xcb, dep_xcb_dri2, dep_xext, dep_xfixes, dep_xdamage, dep_xxf86vm,
-    extra_deps_libgl,
+    dep_xcb_shm, extra_deps_libgl,
   ],
   version : gl_lib_version,
   install : true,