< prev index next >

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

Print this page

        

*** 22,48 **** * or visit www.oracle.com if you need additional information or have any * questions. */ #include <dlfcn.h> #include <stdlib.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); 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); } GtkLib; static GtkLib libs[] = { { GTK_2, --- 22,49 ---- * 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); ! 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); } GtkLib; static GtkLib libs[] = { { GTK_2,
*** 65,81 **** NULL, NULL } }; static GtkLib* get_loaded() { GtkLib* lib = libs; while(!gtk && lib->version) { ! if (lib->check(lib->vname, RTLD_NOLOAD)) { return lib; } ! if (lib->check(lib->name, RTLD_NOLOAD)) { return lib; } lib++; } return NULL; --- 66,99 ---- 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 (isLoadedLib(lib->vname)) { return lib; } ! if (isLoadedLib(lib->name)) { return lib; } lib++; } return NULL;
*** 83,101 **** gboolean gtk_load(JNIEnv *env, GtkVersion version, gboolean verbose) { if (gtk == NULL) { GtkLib* lib = get_loaded(); if (lib) { 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); } gtk = lib->load(env, lib->vname); if (!gtk) { gtk = lib->load(env, lib->name); } --- 101,122 ---- 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", lib->version); } gtk = lib->load(env, lib->vname); if (!gtk) { gtk = lib->load(env, lib->name); }
*** 128,145 **** } } return gtk != NULL; } ! static gboolean check_version(GtkVersion version, int flags) { GtkLib* lib = libs; while (lib->version) { if (version == GTK_ANY || lib->version == version) { ! if (lib->check(lib->vname, flags)) { return TRUE; } ! if (lib->check(lib->name, flags)) { return TRUE; } } lib++; } --- 149,166 ---- } } return gtk != NULL; } ! static gboolean check_version(GtkVersion version) { GtkLib* lib = libs; while (lib->version) { if (version == GTK_ANY || lib->version == version) { ! if (lib->check(lib->vname)) { return TRUE; } ! if (lib->check(lib->name)) { return TRUE; } } lib++; }
*** 148,158 **** gboolean gtk_check_version(GtkVersion version) { if (gtk) { return TRUE; } ! if (check_version(version, RTLD_NOLOAD)) { ! return TRUE; } ! return check_version(version, RTLD_LAZY | RTLD_LOCAL); } - --- 169,179 ---- gboolean gtk_check_version(GtkVersion version) { if (gtk) { return TRUE; } ! GtkLib* lib; ! if (lib = get_loaded()) { ! return lib->check(lib->vname) || lib->check(lib->name); } ! return check_version(version); }
< prev index next >