Work around a broken dlopen/dlclose Linux implementation.

This commit is contained in:
ehofman
2004-06-27 07:49:40 +00:00
parent bbc83f721c
commit 661f64b902
2 changed files with 33 additions and 10 deletions

View File

@@ -25,6 +25,7 @@
#include <string.h>
#include "extensions.hxx"
#include <simgear/debug/logstream.hxx>
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

View File

@@ -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
}