提交 208df119 编写于 作者: L lana

Merge

......@@ -663,13 +663,15 @@ public class AppletClassLoader extends URLClassLoader {
// 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 @@ public void grab() {
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()
......
......@@ -696,7 +696,9 @@ public abstract class SunToolkit extends Toolkit
synchronized (lock) {
executeOnEventHandlerThread(event);
lock.wait();
while(!event.isDispatched()) {
lock.wait();
}
}
Throwable eventThrowable = event.getThrowable();
......
......@@ -228,31 +228,29 @@ public class WToolkit extends SunToolkit implements Runnable {
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();
if (!startToolkitThread(this)) {
Thread toolkitThread = new Thread(this, "AWT-Windows");
toolkitThread.setDaemon(true);
toolkitThread.start();
}
/*
* 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();
}
try {
wait();
}
catch (InterruptedException x) {
try {
synchronized(this) {
while(!inited) {
wait();
}
}
} catch (InterruptedException x) {
// swallow the exception
}
SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
// Enabled "live resizing" by default. It remains controlled
......@@ -265,33 +263,38 @@ public class WToolkit extends SunToolkit implements Runnable {
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 @@ public class WToolkit extends SunToolkit implements Runnable {
* eventLoop() should Dispose the toolkit and exit.
*/
private native boolean init();
private boolean inited = false;
private native void eventLoop();
private native void shutdown();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册