From 0a926d8d57a6c6663dcaee15ee09ecc1329cc140 Mon Sep 17 00:00:00 2001 From: Andrei Dmitriev Date: Wed, 16 Feb 2011 01:12:53 +0300 Subject: [PATCH] 6994933: java.awt.Desktop feature is "intermittently" supported on Solaris. Really unexpected behavior Reviewed-by: art, dcherepanov --- .../classes/sun/awt/X11/XDesktopPeer.java | 35 +++++++++++++++---- jdk/src/solaris/native/sun/xawt/awt_Desktop.c | 8 ++++- 2 files changed, 35 insertions(+), 8 deletions(-) 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; }