]> git.mxchange.org Git - simgear.git/commitdiff
Work around a broken dlopen/dlclose Linux implementation.
authorehofman <ehofman>
Sun, 27 Jun 2004 07:49:40 +0000 (07:49 +0000)
committerehofman <ehofman>
Sun, 27 Jun 2004 07:49:40 +0000 (07:49 +0000)
simgear/screen/extensions.cxx
simgear/screen/extensions.hxx

index 75f7d11e7655594004f6fc3340564dc03635469a..420789eb6aa49e97c23efcdcc076fc08a3a1286a 100644 (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
+
index 26eb3d9d5adeddf0f8ecbef4cec780b40574b2d3..7c97bd60fbe69dbfb382c51a530591206990c7cc 100644 (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
 }