Work around a broken dlopen/dlclose Linux implementation.
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "extensions.hxx"
|
#include "extensions.hxx"
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
static bool SGSearchExtensionsString(char *extString, char *extName) {
|
static bool SGSearchExtensionsString(char *extString, char *extName) {
|
||||||
// Returns GL_TRUE if the *extName string appears in the *extString string,
|
// Returns GL_TRUE if the *extName string appears in the *extString string,
|
||||||
@@ -96,4 +97,30 @@ void* macosxGetGLProcAddress(const char *func) {
|
|||||||
return function;
|
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
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,11 @@ bool SGIsOpenGLExtensionSupported(char *extName);
|
|||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
// don't use an inline function for symbol lookup, since it is too big
|
// don't use an inline function for symbol lookup, since it is too big
|
||||||
void* macosxGetGLProcAddress(const char *func);
|
void* macosxGetGLProcAddress(const char *func);
|
||||||
|
|
||||||
|
#else if !defined( WIN32 )
|
||||||
|
|
||||||
|
void *SGGetGLProcAddress(const char *func);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline void (*SGLookupFunction(const char *func))()
|
inline void (*SGLookupFunction(const char *func))()
|
||||||
@@ -65,16 +70,7 @@ inline void (*SGLookupFunction(const char *func))()
|
|||||||
|
|
||||||
#else // UNIX
|
#else // UNIX
|
||||||
|
|
||||||
// If the target system s UNIX and the ARB_get_proc_address
|
return (void (*)()) SGGetGLProcAddress(func);
|
||||||
// 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;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user