< prev index next >

src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c

Print this page

        

@@ -22,27 +22,28 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 #include <dlfcn.h>
 #include <stdlib.h>
+#include <string.h>
 #include "jvm_md.h"
 #include "gtk_interface.h"
 
 GtkApi* gtk2_load(JNIEnv *env, const char* lib_name);
 GtkApi* gtk3_load(JNIEnv *env, const char* lib_name);
 
-gboolean gtk2_check(const char* lib_name, int flags);
-gboolean gtk3_check(const char* lib_name, int flags);
+gboolean gtk2_check(const char* lib_name);
+gboolean gtk3_check(const char* lib_name);
 
 GtkApi *gtk;
 
 typedef struct {
     GtkVersion version;
     const char* name;
     const char* vname;
     GtkApi* (*load)(JNIEnv *env, const char* lib_name);
-    gboolean (*check)(const char* lib_name, int flags);
+    gboolean (*check)(const char* lib_name);
 } GtkLib;
 
 static GtkLib libs[] = {
     {
         GTK_2,

@@ -65,17 +66,34 @@
         NULL,
         NULL
     }
 };
 
+static gboolean isLoadedLib(const char *lib_name) {
+    FILE* fp = fopen("/proc/self/maps", "r");
+    if (!fp) {
+        return FALSE;
+    }
+    char line[512];
+    while (fgets(line, 512, fp) != NULL)
+    {
+        if (strstr(line, lib_name)) {
+            fclose(fp);
+            return TRUE;
+        }
+    }
+    fclose(fp);
+    return FALSE;
+}
+
 static GtkLib* get_loaded() {
     GtkLib* lib = libs;
     while(!gtk && lib->version) {
-        if (lib->check(lib->vname, RTLD_NOLOAD)) {
+        if (isLoadedLib(lib->vname)) {
             return lib;
         }
-        if (lib->check(lib->name, RTLD_NOLOAD)) {
+        if (isLoadedLib(lib->name)) {
             return lib;
         }
         lib++;
     }
     return NULL;

@@ -83,19 +101,22 @@
 
 gboolean gtk_load(JNIEnv *env, GtkVersion version, gboolean verbose) {
     if (gtk == NULL) {
         GtkLib* lib = get_loaded();
         if (lib) {
+            if (verbose) {
+                fprintf(stderr,"%s is already loaded\n",lib->name);
+            }
             if (version != GTK_ANY && lib->version != version) {
                 if (verbose) {
                     fprintf(stderr, "WARNING: Cannot load GTK%d library: \
                          GTK%d has already been loaded\n", version, lib->version);
                 }
                 return FALSE;
             }
             if (verbose) {
-                fprintf(stderr, "Looking for GTK%d library...\n", version);
+                fprintf(stderr, "Looking for GTK%d library...\n", lib->version);
             }
             gtk = lib->load(env, lib->vname);
             if (!gtk) {
                 gtk = lib->load(env, lib->name);
             }

@@ -128,18 +149,18 @@
         }
     }
     return gtk != NULL;
 }
 
-static gboolean check_version(GtkVersion version, int flags) {
+static gboolean check_version(GtkVersion version) {
     GtkLib* lib = libs;
     while (lib->version) {
         if (version == GTK_ANY || lib->version == version) {
-            if (lib->check(lib->vname, flags)) {
+            if (lib->check(lib->vname)) {
                 return TRUE;
             }
-            if (lib->check(lib->name, flags)) {
+            if (lib->check(lib->name)) {
                 return TRUE;
             }
         }
         lib++;
     }

@@ -148,11 +169,11 @@
 
 gboolean gtk_check_version(GtkVersion version) {
     if (gtk) {
         return TRUE;
     }
-    if (check_version(version, RTLD_NOLOAD)) {
-        return TRUE;
+    GtkLib* lib;
+    if (lib = get_loaded()) {
+        return lib->check(lib->vname) || lib->check(lib->name);
     }
-    return check_version(version, RTLD_LAZY | RTLD_LOCAL);
+    return check_version(version);
 }
-
< prev index next >