diff options
Diffstat (limited to 'src/mesa/main/dlopen.h')
-rw-r--r-- | src/mesa/main/dlopen.h | 83 |
1 files changed, 75 insertions, 8 deletions
diff --git a/src/mesa/main/dlopen.h b/src/mesa/main/dlopen.h index 9895a22549a..a5366a14e0f 100644 --- a/src/mesa/main/dlopen.h +++ b/src/mesa/main/dlopen.h @@ -25,18 +25,85 @@ #ifndef DLOPEN_H #define DLOPEN_H +/** + * Wrapper functions for dlopen(), dlsym(), dlclose(). + * Note that the #ifdef tests for various environments should be expanded. + */ -typedef void (*GenericFunc)(void); - +#if defined(HAVE_DLOPEN) +#include <dlfcn.h> +#endif +#if defined(_WIN32) +#include <windows.h> +#endif -extern void * -_mesa_dlopen(const char *libname, int flags); +typedef void (*GenericFunc)(void); -extern GenericFunc -_mesa_dlsym(void *handle, const char *fname); +/** + * Wrapper for dlopen(). + * Note that 'flags' isn't used at this time. + */ +static inline void * +_mesa_dlopen(const char *libname, int flags) +{ +#if defined(__blrts) + return NULL; +#elif defined(HAVE_DLOPEN) + flags = RTLD_LAZY | RTLD_GLOBAL; /* Overriding flags at this time */ + return dlopen(libname, flags); +#elif defined(__MINGW32__) + return LoadLibraryA(libname); +#else + return NULL; +#endif +} -extern void -_mesa_dlclose(void *handle); +/** + * Wrapper for dlsym() that does a cast to a generic function type, + * rather than a void *. This reduces the number of warnings that are + * generated. + */ +static inline GenericFunc +_mesa_dlsym(void *handle, const char *fname) +{ + union { + void *v; + GenericFunc f; + } u; +#if defined(__blrts) + u.v = NULL; +#elif defined(__DJGPP__) + /* need '_' prefix on symbol names */ + char fname2[1000]; + fname2[0] = '_'; + strncpy(fname2 + 1, fname, 998); + fname2[999] = 0; + u.v = dlsym(handle, fname2); +#elif defined(HAVE_DLOPEN) + u.v = dlsym(handle, fname); +#elif defined(__MINGW32__) + u.v = (void *) GetProcAddress(handle, fname); +#else + u.v = NULL; +#endif + return u.f; +} +/** + * Wrapper for dlclose(). + */ +static inline void +_mesa_dlclose(void *handle) +{ +#if defined(__blrts) + (void) handle; +#elif defined(HAVE_DLOPEN) + dlclose(handle); +#elif defined(__MINGW32__) + FreeLibrary(handle); +#else + (void) handle; +#endif +} #endif |