xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Wed Mar 28 19:05:06 UTC 2018


 glx/vndext.c |   15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

New commits:
commit 16639ab77d14cecb7d03fd2d5c796c2fb1714c18
Author: Kyle Brenneman <kbrenneman at nvidia.com>
Date:   Fri Mar 2 17:58:07 2018 -0700

    Don't delete GLX's extensionInitCallback list during a reset.
    
    When a callback list is initialized using CreateCallbackList via AddCallback,
    the list gets added to the listsToCleanup array, and as a result the list gets
    deleted at the end of the server generation.
    
    But, vendor libraries add themselves to that callback list only once, not once
    per generation, so if you delete the list, then no vendor will register itself
    on the next generation, and GLX breaks.
    
    Instead, use a static CallbackListRec for the extensionInitCallback list. That
    way, it doesn't get added to listsToCleanup, and doesn't get deleted during a
    reset.
    
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/vndext.c b/glx/vndext.c
index c8d753234..cef306a40 100644
--- a/glx/vndext.c
+++ b/glx/vndext.c
@@ -40,7 +40,8 @@
 #include "vndservervendor.h"
 
 int GlxErrorBase = 0;
-static CallbackListPtr vndInitCallbackList;
+static CallbackListRec vndInitCallbackList;
+static CallbackListPtr vndInitCallbackListPtr = &vndInitCallbackList;
 static DevPrivateKeyRec glvXGLVScreenPrivKey;
 static DevPrivateKeyRec glvXGLVClientPrivKey;
 
@@ -187,6 +188,14 @@ GLXReset(ExtensionEntry *extEntry)
     GlxVendorExtensionReset(extEntry);
     GlxDispatchReset();
     GlxMappingReset();
+
+    if ((dispatchException & DE_TERMINATE) == DE_TERMINATE) {
+        while (vndInitCallbackList.list != NULL) {
+            CallbackPtr next = vndInitCallbackList.list->next;
+            free(vndInitCallbackList.list);
+            vndInitCallbackList.list = next;
+        }
+    }
 }
 
 void
@@ -220,7 +229,7 @@ GlxExtensionInit(void)
     }
 
     GlxErrorBase = extEntry->errorBase;
-    CallCallbacks(&vndInitCallbackList, extEntry);
+    CallCallbacks(&vndInitCallbackListPtr, extEntry);
 }
 
 static int
@@ -280,7 +289,7 @@ _X_EXPORT const GlxServerExports glxServer = {
     .majorVersion = 0,
     .minorVersion = 0,
 
-    .extensionInitCallback = &vndInitCallbackList,
+    .extensionInitCallback = &vndInitCallbackListPtr,
 
     .allocateServerImports = GlxAllocateServerImports,
     .freeServerImports = GlxFreeServerImports,


More information about the xorg-commit mailing list