egl: free display ext data in xdri_eglTerminate().
This commit is contained in:
@@ -651,6 +651,35 @@ xdri_eglInitialize(_EGLDriver *drv, EGLDisplay dpy,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Do some clean-up that normally occurs in XCloseDisplay().
|
||||
* We do this here because we're about to unload a dynamic library
|
||||
* that has added some per-display extension data and callbacks.
|
||||
* If we don't do this here we'll crash in XCloseDisplay() because it'll
|
||||
* try to call functions that went away when the driver library was unloaded.
|
||||
*/
|
||||
static void
|
||||
FreeDisplayExt(Display *dpy)
|
||||
{
|
||||
_XExtension *ext, *next;
|
||||
|
||||
for (ext = dpy->ext_procs; ext; ext = next) {
|
||||
next = ext->next;
|
||||
if (ext->close_display) {
|
||||
ext->close_display(dpy, &ext->codes);
|
||||
ext->close_display = NULL;
|
||||
}
|
||||
if (ext->name)
|
||||
Xfree(ext->name);
|
||||
Xfree(ext);
|
||||
}
|
||||
dpy->ext_procs = NULL;
|
||||
|
||||
_XFreeExtData (dpy->ext_data);
|
||||
dpy->ext_data = NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called via eglTerminate(), drv->API.Terminate().
|
||||
*/
|
||||
@@ -658,11 +687,16 @@ static EGLBoolean
|
||||
xdri_eglTerminate(_EGLDriver *drv, EGLDisplay dpy)
|
||||
{
|
||||
struct xdri_egl_driver *xdri_drv = xdri_egl_driver(drv);
|
||||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
|
||||
_eglLog(_EGL_DEBUG, "XDRI: eglTerminate");
|
||||
|
||||
_eglLog(_EGL_DEBUG, "XDRI: Closing %s", xdri_drv->dri_driver_name);
|
||||
|
||||
FreeDisplayExt(disp->Xdpy);
|
||||
|
||||
#if 0
|
||||
/* this causes a segfault for some reason */
|
||||
dlclose(xdri_drv->dri_driver_handle);
|
||||
#endif
|
||||
xdri_drv->dri_driver_handle = NULL;
|
||||
|
Reference in New Issue
Block a user