--- a/jdk/src/share/classes/sun/applet/AppletClassLoader.java Mon Jan 24 13:18:36 2011 -0800
+++ b/jdk/src/share/classes/sun/applet/AppletClassLoader.java Mon Jan 24 13:20:07 2011 -0800
@@ -663,13 +663,15 @@
// set the context class loader to the AppletClassLoader.
creatorThread.setContextClassLoader(AppletClassLoader.this);
- synchronized(creatorThread.syncObject) {
- creatorThread.start();
- try {
- creatorThread.syncObject.wait();
- } catch (InterruptedException e) { }
- appContext = creatorThread.appContext;
- }
+ creatorThread.start();
+ try {
+ synchronized(creatorThread.syncObject) {
+ while (!creatorThread.created) {
+ creatorThread.syncObject.wait();
+ }
+ }
+ } catch (InterruptedException e) { }
+ appContext = creatorThread.appContext;
return null;
}
});
@@ -854,14 +856,16 @@
class AppContextCreator extends Thread {
Object syncObject = new Object();
AppContext appContext = null;
+ volatile boolean created = false;
AppContextCreator(ThreadGroup group) {
super(group, "AppContextCreator");
}
public void run() {
- synchronized(syncObject) {
- appContext = SunToolkit.createNewAppContext();
+ appContext = SunToolkit.createNewAppContext();
+ created = true;
+ synchronized(syncObject) {
syncObject.notifyAll();
}
} // run()
--- a/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Jan 24 13:18:36 2011 -0800
+++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Jan 24 13:20:07 2011 -0800
@@ -696,7 +696,9 @@
synchronized (lock) {
executeOnEventHandlerThread(event);
- lock.wait();
+ while(!event.isDispatched()) {
+ lock.wait();
+ }
}
Throwable eventThrowable = event.getThrowable();
--- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Mon Jan 24 13:18:36 2011 -0800
+++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java Mon Jan 24 13:20:07 2011 -0800
@@ -228,31 +228,29 @@
sun.java2d.Disposer.addRecord(anchor, new ToolkitDisposer());
- synchronized (this) {
- // Fix for bug #4046430 -- Race condition
- // where notifyAll can be called before
- // the "AWT-Windows" thread's parent thread is
- // waiting, resulting in a deadlock on startup.
-
- /*
- * Fix for 4701990.
- * AWTAutoShutdown state must be changed before the toolkit thread
- * starts to avoid race condition.
- */
- AWTAutoShutdown.notifyToolkitThreadBusy();
+ /*
+ * Fix for 4701990.
+ * AWTAutoShutdown state must be changed before the toolkit thread
+ * starts to avoid race condition.
+ */
+ AWTAutoShutdown.notifyToolkitThreadBusy();
- if (!startToolkitThread(this)) {
- Thread toolkitThread = new Thread(this, "AWT-Windows");
- toolkitThread.setDaemon(true);
- toolkitThread.start();
- }
+ if (!startToolkitThread(this)) {
+ Thread toolkitThread = new Thread(this, "AWT-Windows");
+ toolkitThread.setDaemon(true);
+ toolkitThread.start();
+ }
- try {
- wait();
+ try {
+ synchronized(this) {
+ while(!inited) {
+ wait();
+ }
}
- catch (InterruptedException x) {
- }
+ } catch (InterruptedException x) {
+ // swallow the exception
}
+
SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
// Enabled "live resizing" by default. It remains controlled
@@ -265,33 +263,38 @@
setExtraMouseButtonsEnabledNative(areExtraMouseButtonsEnabled);
}
+ private final void registerShutdownHook() {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ThreadGroup currentTG =
+ Thread.currentThread().getThreadGroup();
+ ThreadGroup parentTG = currentTG.getParent();
+ while (parentTG != null) {
+ currentTG = parentTG;
+ parentTG = currentTG.getParent();
+ }
+ Thread shutdown = new Thread(currentTG, new Runnable() {
+ public void run() {
+ shutdown();
+ }
+ });
+ shutdown.setContextClassLoader(null);
+ Runtime.getRuntime().addShutdownHook(shutdown);
+ return null;
+ }
+ });
+ }
+
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
boolean startPump = init();
if (startPump) {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- ThreadGroup currentTG =
- Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = currentTG.getParent();
- while (parentTG != null) {
- currentTG = parentTG;
- parentTG = currentTG.getParent();
- }
- Thread shutdown = new Thread(currentTG, new Runnable() {
- public void run() {
- shutdown();
- }
- });
- shutdown.setContextClassLoader(null);
- Runtime.getRuntime().addShutdownHook(shutdown);
- return null;
- }
- });
+ registerShutdownHook();
}
synchronized(this) {
+ inited = true;
notifyAll();
}
@@ -309,6 +312,8 @@
* eventLoop() should Dispose the toolkit and exit.
*/
private native boolean init();
+ private boolean inited = false;
+
private native void eventLoop();
private native void shutdown();