6994933: java.awt.Desktop feature is "intermittently" supported on Solaris. Really unexpected behavior.
Reviewed-by: art, dcherepanov
diff --git a/src/solaris/classes/sun/awt/X11/XDesktopPeer.java b/src/solaris/classes/sun/awt/X11/XDesktopPeer.java
index ce6ae16..740eaba 100644
--- a/src/solaris/classes/sun/awt/X11/XDesktopPeer.java
+++ b/src/solaris/classes/sun/awt/X11/XDesktopPeer.java
@@ -44,11 +44,27 @@
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 @@
}
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/src/solaris/native/sun/xawt/awt_Desktop.c b/src/solaris/native/sun/xawt/awt_Desktop.c
index d9f9be2..69b9207 100644
--- a/src/solaris/native/sun/xawt/awt_Desktop.c
+++ b/src/solaris/native/sun/xawt/awt_Desktop.c
@@ -48,9 +48,15 @@
}
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;
}