提交 d36abb1c 编写于 作者: D dcherepanov

7011446: ./windows/classes/sun/awt/windows/WToolkit.java needs to avoid spurious wakeup

Reviewed-by: anthony
上级 7a713d60
...@@ -228,31 +228,29 @@ public class WToolkit extends SunToolkit implements Runnable { ...@@ -228,31 +228,29 @@ public class WToolkit extends SunToolkit implements Runnable {
sun.java2d.Disposer.addRecord(anchor, new ToolkitDisposer()); sun.java2d.Disposer.addRecord(anchor, new ToolkitDisposer());
synchronized (this) { /*
// Fix for bug #4046430 -- Race condition * Fix for 4701990.
// where notifyAll can be called before * AWTAutoShutdown state must be changed before the toolkit thread
// the "AWT-Windows" thread's parent thread is * starts to avoid race condition.
// waiting, resulting in a deadlock on startup. */
AWTAutoShutdown.notifyToolkitThreadBusy();
/*
* Fix for 4701990. if (!startToolkitThread(this)) {
* AWTAutoShutdown state must be changed before the toolkit thread Thread toolkitThread = new Thread(this, "AWT-Windows");
* starts to avoid race condition. toolkitThread.setDaemon(true);
*/ toolkitThread.start();
AWTAutoShutdown.notifyToolkitThreadBusy(); }
if (!startToolkitThread(this)) {
Thread toolkitThread = new Thread(this, "AWT-Windows");
toolkitThread.setDaemon(true);
toolkitThread.start();
}
try { try {
wait(); synchronized(this) {
} while(!inited) {
catch (InterruptedException x) { wait();
}
} }
} catch (InterruptedException x) {
// swallow the exception
} }
SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME); SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
// Enabled "live resizing" by default. It remains controlled // Enabled "live resizing" by default. It remains controlled
...@@ -265,33 +263,38 @@ public class WToolkit extends SunToolkit implements Runnable { ...@@ -265,33 +263,38 @@ public class WToolkit extends SunToolkit implements Runnable {
setExtraMouseButtonsEnabledNative(areExtraMouseButtonsEnabled); 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() { public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1); Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
boolean startPump = init(); boolean startPump = init();
if (startPump) { if (startPump) {
AccessController.doPrivileged(new PrivilegedAction() { registerShutdownHook();
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;
}
});
} }
synchronized(this) { synchronized(this) {
inited = true;
notifyAll(); notifyAll();
} }
...@@ -309,6 +312,8 @@ public class WToolkit extends SunToolkit implements Runnable { ...@@ -309,6 +312,8 @@ public class WToolkit extends SunToolkit implements Runnable {
* eventLoop() should Dispose the toolkit and exit. * eventLoop() should Dispose the toolkit and exit.
*/ */
private native boolean init(); private native boolean init();
private boolean inited = false;
private native void eventLoop(); private native void eventLoop();
private native void shutdown(); private native void shutdown();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册