Re: [PATCH xserver] Don't delete GLX's extensionInitCallback list during a reset.

2018-03-28 Thread Adam Jackson
On Fri, 2018-03-02 at 17:58 -0700, Kyle Brenneman wrote:
> 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.

Yeah, this works. This is kind of why I'd wanted to see each screen
register its own provider during init, though the swrast fallback
problem makes that less awesome. Still, merged, thanks:

remote: I: patch #207871 updated using rev 
16639ab77d14cecb7d03fd2d5c796c2fb1714c18.
remote: I: 1 patch(es) updated to state Accepted.
To ssh://git.freedesktop.org/git/xorg/xserver
   7004a7c3c9..16639ab77d  master -> master

- ajax
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

[PATCH xserver] Don't delete GLX's extensionInitCallback list during a reset.

2018-03-02 Thread Kyle Brenneman
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.
---
 glx/vndext.c | 15 ---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/glx/vndext.c b/glx/vndext.c
index c8d7532..cef306a 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 = 
 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(, extEntry);
+CallCallbacks(, extEntry);
 }
 
 static int
@@ -280,7 +289,7 @@ _X_EXPORT const GlxServerExports glxServer = {
 .majorVersion = 0,
 .minorVersion = 0,
 
-.extensionInitCallback = ,
+.extensionInitCallback = ,
 
 .allocateServerImports = GlxAllocateServerImports,
 .freeServerImports = GlxFreeServerImports,
-- 
2.7.4

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel