diff options
author | George Nassas <gnassas@gmail.com> | 2007-12-06 10:11:05 +0100 |
---|---|---|
committer | Michel Dänzer <michel@tungstengraphics.com> | 2007-12-06 10:11:05 +0100 |
commit | 17afc800c9b69997ae7ba52b67c021f68066e008 (patch) | |
tree | 055aeaddd779a023ca818975621fdbe9edfaed16 /src/glx | |
parent | 125bd4cae51c6deaacd2e90f14931c2052f146ab (diff) |
Always call dlopen in DriverOpen.
This increases the reference count for the driver binary, preventing it from
getting unloaded prematurely in driDestroyDisplay. See
https://bugs.freedesktop.org/show_bug.cgi?id=13541 .
Diffstat (limited to 'src/glx')
-rw-r--r-- | src/glx/x11/dri_glx.c | 8 | ||||
-rw-r--r-- | src/glx/x11/glxclient.h | 1 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index c02f105611c..9c3a78b31b7 100644 --- a/src/glx/x11/dri_glx.c +++ b/src/glx/x11/dri_glx.c @@ -194,7 +194,8 @@ static __DRIdriver *OpenDriver(const char *driverName) /* First, search Drivers list to see if we've already opened this driver */ for (driver = Drivers; driver; driver = driver->next) { if (strcmp(driver->name, driverName) == 0) { - /* found it */ + /* found it, increment library refcount & return */ + dlopen(driver->libpath, RTLD_NOW | RTLD_GLOBAL); return driver; } } @@ -238,7 +239,9 @@ static __DRIdriver *OpenDriver(const char *driverName) break; /* out of memory! */ /* init the struct */ driver->name = __glXstrdup(driverName); - if (!driver->name) { + driver->libpath = __glXstrdup(realDriverName); + if (!driver->name || !driver->libpath) { + if (driver->name) XFree(driver->name); Xfree(driver); driver = NULL; break; /* out of memory! */ @@ -401,6 +404,7 @@ static void driDestroyDisplay(Display *dpy, void *private) Drivers = driver->next; Xfree(driver->name); + Xfree(driver->libpath); Xfree(driver); break; } diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h index 05354073c45..7054f3cc310 100644 --- a/src/glx/x11/glxclient.h +++ b/src/glx/x11/glxclient.h @@ -117,6 +117,7 @@ struct __DRIdisplayRec { */ struct __DRIdriverRec { const char *name; + const char *libpath; void *handle; PFNCREATENEWSCREENFUNC createNewScreenFunc; struct __DRIdriverRec *next; |