diff --git a/jdk/src/solaris/classes/sun/awt/X11/XDesktopPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XDesktopPeer.java index ce6ae164154..740eabac485 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XDesktopPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XDesktopPeer.java @@ -44,11 +44,27 @@ import java.awt.peer.DesktopPeer; public class XDesktopPeer implements DesktopPeer { private static boolean nativeLibraryLoaded = false; - static { - nativeLibraryLoaded = init(); + private static boolean initExecuted = false; + + private static void initWithLock(){ + XToolkit.awtLock(); + try { + if (!initExecuted) { + nativeLibraryLoaded = init(); + } + } finally { + initExecuted = true; + XToolkit.awtUnlock(); + } + } + + //package-private + XDesktopPeer(){ + initWithLock(); } static boolean isDesktopSupported() { + initWithLock(); return nativeLibraryLoaded; } @@ -83,12 +99,17 @@ public class XDesktopPeer implements DesktopPeer { } private void launch(URI uri) throws IOException { - if (!nativeLibraryLoaded) { - throw new IOException("Failed to load native libraries."); - } - byte[] uriByteArray = ( uri.toString() + '\0' ).getBytes(); - boolean result = gnome_url_show(uriByteArray); + boolean result = false; + XToolkit.awtLock(); + try { + if (!nativeLibraryLoaded) { + throw new IOException("Failed to load native libraries."); + } + result = gnome_url_show(uriByteArray); + } finally { + XToolkit.awtUnlock(); + } if (!result) { throw new IOException("Failed to show URI:" + uri); } diff --git a/jdk/src/solaris/native/sun/xawt/awt_Desktop.c b/jdk/src/solaris/native/sun/xawt/awt_Desktop.c index d9f9be2bf1c..69b9207bc99 100644 --- a/jdk/src/solaris/native/sun/xawt/awt_Desktop.c +++ b/jdk/src/solaris/native/sun/xawt/awt_Desktop.c @@ -48,9 +48,15 @@ int init(){ } dlerror(); /* Clear errors */ gnome_vfs_init = (GNOME_VFS_INIT_TYPE*)dlsym(vfs_handle, "gnome_vfs_init"); + if (gnome_vfs_init == NULL){ +#ifdef INTERNAL_BUILD + fprintf(stderr, "dlsym( gnome_vfs_init) returned NULL\n"); +#endif + return 0; + } if ((errmsg = dlerror()) != NULL) { #ifdef INTERNAL_BUILD - fprintf(stderr, "can not find symble gnome_vfs_init\n"); + fprintf(stderr, "can not find symbol gnome_vfs_init %s \n", errmsg); #endif return 0; }