st/xlib: Hang off screen destructor off main XCloseDisplay() callback.
authorGeorge Kyriazis <george.kyriazis@intel.com>
Thu, 3 Mar 2016 01:28:00 +0000 (18:28 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 4 Mar 2016 17:57:24 +0000 (10:57 -0700)
This resolves some order dependencies between the already existing
callback the newly created one.

Tested-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/state_trackers/glx/xlib/glx_api.c
src/gallium/state_trackers/glx/xlib/xm_api.c
src/gallium/state_trackers/glx/xlib/xm_api.h

index 0456d44104e3ebb3af5409f53f661081bb324325..1c541b76db55ba82e9072120c8f3bd9b2982dd24 100644 (file)
@@ -615,6 +615,7 @@ close_display_callback(Display *dpy, XExtCodes *codes)
 {
    xmesa_destroy_buffers_on_display(dpy);
    destroy_visuals_on_display(dpy);
+   xmesa_close_display(dpy);
    return 0;
 }
 
index 2f1bfaec4a0dee3fbe866ef62db9d91f9f12d431..cee4f18295e057d7d6a5fe179e81a5c81bd7e724 100644 (file)
@@ -126,7 +126,6 @@ xmesa_get_param(struct st_manager *smapi,
 typedef struct _XMesaExtDisplayInfo {
    struct _XMesaExtDisplayInfo *next;
    Display *display;
-   XExtCodes *codes;
    struct xmesa_display mesaDisplay;
 } XMesaExtDisplayInfo;
 
@@ -138,8 +137,8 @@ typedef struct _XMesaExtInfo {
 static XMesaExtInfo MesaExtInfo;
 
 /* hook to delete XMesaDisplay on XDestroyDisplay */
-static int
-xmesa_close_display(Display *display, XExtCodes *codes)
+extern void
+xmesa_close_display(Display *display)
 {
    XMesaExtDisplayInfo *info, *prev;
 
@@ -159,7 +158,7 @@ xmesa_close_display(Display *display, XExtCodes *codes)
    if (info == NULL) {
       /* no display found */
       _XUnlockMutex(_Xglobal_lock);
-      return 0;
+      return;
    }
 
    /* remove display entry from list */
@@ -181,7 +180,6 @@ xmesa_close_display(Display *display, XExtCodes *codes)
    free(xmdpy->smapi);
 
    XFree((char *) info);
-   return 1;
 }
 
 static XMesaDisplay
@@ -218,14 +216,6 @@ xmesa_init_display( Display *display )
       return NULL;
    }
    info->display = display;
-   info->codes = XAddExtension(display);
-   if (info->codes == NULL) {
-      /* could not allocate extension.  Fail */
-      Xfree(info);
-      pipe_mutex_unlock(init_mutex);
-      return NULL;
-   }
-   XESetCloseDisplay(display, info->codes->extension, xmesa_close_display);
    xmdpy = &info->mesaDisplay; /* to be filled out below */
 
    /* chain to the list of displays */
@@ -236,32 +226,30 @@ xmesa_init_display( Display *display )
    _XUnlockMutex(_Xglobal_lock);
 
    /* now create the new XMesaDisplay info */
-   if (display) {
-      xmdpy->display = display;
-      xmdpy->screen = driver.create_pipe_screen(display);
-      xmdpy->smapi = CALLOC_STRUCT(st_manager);
-      xmdpy->pipe = NULL;
-      if (xmdpy->smapi) {
-         xmdpy->smapi->screen = xmdpy->screen;
-         xmdpy->smapi->get_param = xmesa_get_param;
-      }
+   assert(display);
+
+   xmdpy->display = display;
+   xmdpy->screen = driver.create_pipe_screen(display);
+   xmdpy->smapi = CALLOC_STRUCT(st_manager);
+   xmdpy->pipe = NULL;
+   if (xmdpy->smapi) {
+      xmdpy->smapi->screen = xmdpy->screen;
+      xmdpy->smapi->get_param = xmesa_get_param;
+   }
 
-      if (xmdpy->screen && xmdpy->smapi) {
-         pipe_mutex_init(xmdpy->mutex);
+   if (xmdpy->screen && xmdpy->smapi) {
+      pipe_mutex_init(xmdpy->mutex);
+   }
+   else {
+      if (xmdpy->screen) {
+         xmdpy->screen->destroy(xmdpy->screen);
+         xmdpy->screen = NULL;
       }
-      else {
-         if (xmdpy->screen) {
-            xmdpy->screen->destroy(xmdpy->screen);
-            xmdpy->screen = NULL;
-         }
-         free(xmdpy->smapi);
-         xmdpy->smapi = NULL;
+      free(xmdpy->smapi);
+      xmdpy->smapi = NULL;
 
-         xmdpy->display = NULL;
-      }
+      xmdpy->display = NULL;
    }
-   if (!xmdpy->display || xmdpy->display != display)
-      xmdpy = NULL;
 
    pipe_mutex_unlock(init_mutex);
 
index ffdffc0940feb93fbffde7ce8019f22aa2e93d02..ccf35a5eb5a4dd453bed57b8dc9ed962e9fd2bc5 100644 (file)
@@ -378,6 +378,9 @@ xmesa_check_buffer_size(XMesaBuffer b);
 extern void
 xmesa_destroy_buffers_on_display(Display *dpy);
 
+extern void
+xmesa_close_display(Display *dpy);
+
 static inline GLuint
 xmesa_buffer_width(XMesaBuffer b)
 {