mesa: Rename "struct gl_array_object" to gl_vertex_array_object.
[mesa.git] / src / mesa / main / dlopen.h
index 9895a22549ae2a7d51dfff40dbb578d7c5088d5a..55a56f0d70a57ce885c8370dfb4356031b15f8ac 100644 (file)
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
  */
 
 
 #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