OpenJDK / portola / portola
changeset 7958:865c081c8372
Merge
author | lana |
---|---|
date | Mon, 24 Jan 2011 13:20:07 -0800 |
parents | 5b29f9801eac 900a9e8d6c4e |
children | 1f5dc732e4d6 |
files | |
diffstat | 3 files changed, 61 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- 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();