diff options
Diffstat (limited to 'src/solaris/classes/sun/awt/X11/XToolkit.java')
-rw-r--r-- | src/solaris/classes/sun/awt/X11/XToolkit.java | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java index 8676c6aff..710d8ac8a 100644 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -307,22 +307,35 @@ public final class XToolkit extends UNIXToolkit implements Runnable { } finally { awtUnlock(); } - - Runtime.getRuntime().addShutdownHook(new Thread() { - public void run() { - XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance(); - if (peer != null) { - peer.dispose(); - } - if (xs != null) { - ((XAWTXSettings)xs).dispose(); - } - freeXKB(); - if (log.isLoggable(PlatformLogger.FINE)) { - dumpPeers(); + PrivilegedAction<Void> a = new PrivilegedAction<Void>() { + public Void run() { + ThreadGroup mainTG = Thread.currentThread().getThreadGroup(); + ThreadGroup parentTG = mainTG.getParent(); + while (parentTG != null) { + mainTG = parentTG; + parentTG = mainTG.getParent(); } + Thread shutdownThread = new Thread(mainTG, "XToolkt-Shutdown-Thread") { + public void run() { + XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance(); + if (peer != null) { + peer.dispose(); + } + if (xs != null) { + ((XAWTXSettings)xs).dispose(); + } + freeXKB(); + if (log.isLoggable(PlatformLogger.FINE)) { + dumpPeers(); + } + } + }; + shutdownThread.setContextClassLoader(null); + Runtime.getRuntime().addShutdownHook(shutdownThread); + return null; } - }); + }; + AccessController.doPrivileged(a); } static String getCorrectXIDString(String val) { |