From 661f64b902ddaddcbb1859a71671f06415049abc Mon Sep 17 00:00:00 2001 From: ehofman Date: Sun, 27 Jun 2004 07:49:40 +0000 Subject: [PATCH] Work around a broken dlopen/dlclose Linux implementation. --- simgear/screen/extensions.cxx | 27 +++++++++++++++++++++++++++ simgear/screen/extensions.hxx | 16 ++++++---------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/simgear/screen/extensions.cxx b/simgear/screen/extensions.cxx index 75f7d11e..420789eb 100644 --- a/simgear/screen/extensions.cxx +++ b/simgear/screen/extensions.cxx @@ -25,6 +25,7 @@ #include #include "extensions.hxx" +#include static bool SGSearchExtensionsString(char *extString, char *extName) { // Returns GL_TRUE if the *extName string appears in the *extString string, @@ -96,4 +97,30 @@ void* macosxGetGLProcAddress(const char *func) { return function; } +#else if !defined( WIN32 ) + +void *SGGetGLProcAddress(const char *func) { + static void *libHandle = NULL; + void (*fptr)() = NULL; + + /* + * Clear the error buffer + */ + dlerror(); + + if (libHandle == NULL) + libHandle = dlopen("libGL.so", RTLD_LAZY); + + if (libHandle != NULL) { + fptr = (void (*)()) dlsym(libHandle, func); + + char *error = dlerror(); + if (error) + SG_LOG(SG_GENERAL, SG_INFO, error); + } + + return fptr; +} + #endif + diff --git a/simgear/screen/extensions.hxx b/simgear/screen/extensions.hxx index 26eb3d9d..7c97bd60 100644 --- a/simgear/screen/extensions.hxx +++ b/simgear/screen/extensions.hxx @@ -53,6 +53,11 @@ bool SGIsOpenGLExtensionSupported(char *extName); #ifdef __APPLE__ // don't use an inline function for symbol lookup, since it is too big void* macosxGetGLProcAddress(const char *func); + +#else if !defined( WIN32 ) + + void *SGGetGLProcAddress(const char *func); + #endif inline void (*SGLookupFunction(const char *func))() @@ -65,16 +70,7 @@ inline void (*SGLookupFunction(const char *func))() #else // UNIX - // If the target system s UNIX and the ARB_get_proc_address - // GLX extension is *not* guaranteed to be supported. An alternative - // dlsym-based approach will be used instead. - - void *libHandle; - void (*fptr)(); - libHandle = dlopen("libGL.so", RTLD_LAZY); - fptr = (void (*)()) dlsym(libHandle, func); - dlclose(libHandle); - return fptr; + return (void (*)()) SGGetGLProcAddress(func); #endif } -- 2.39.2