diff --git a/src/share/classes/java/awt/EventQueue.java b/src/share/classes/java/awt/EventQueue.java index 5795c37ae916faf7bdf6111437aa2a1bcc7f0803..b9f96f995beee8b4362be17bacdeaffa4b3d0b9d 100644 --- a/src/share/classes/java/awt/EventQueue.java +++ b/src/share/classes/java/awt/EventQueue.java @@ -179,6 +179,11 @@ public class EventQueue { */ private volatile int waitForID; + /* + * AppContext corresponding to the queue. + */ + private final AppContext appContext; + private final String name = "AWT-EventQueue-" + threadInitNumber.getAndIncrement(); private static final PlatformLogger eventLog = PlatformLogger.getLogger("java.awt.event.EventQueue"); @@ -225,8 +230,9 @@ public class EventQueue { * completes thus causing mess in thread group to appcontext mapping. */ - pushPopLock = (Lock)AppContext.getAppContext().get(AppContext.EVENT_QUEUE_LOCK_KEY); - pushPopCond = (Condition)AppContext.getAppContext().get(AppContext.EVENT_QUEUE_COND_KEY); + appContext = AppContext.getAppContext(); + pushPopLock = (Lock)appContext.get(AppContext.EVENT_QUEUE_LOCK_KEY); + pushPopCond = (Condition)appContext.get(AppContext.EVENT_QUEUE_COND_KEY); } /** @@ -240,7 +246,7 @@ public class EventQueue { * @throws NullPointerException if theEvent is null */ public void postEvent(AWTEvent theEvent) { - SunToolkit.flushPendingEvents(); + SunToolkit.flushPendingEvents(appContext); postEventPrivate(theEvent); } @@ -525,7 +531,7 @@ public class EventQueue { * of the synchronized block to avoid deadlock when * event queues are nested with push()/pop(). */ - SunToolkit.flushPendingEvents(); + SunToolkit.flushPendingEvents(appContext); pushPopLock.lock(); try { AWTEvent event = getNextEventPrivate(); @@ -565,7 +571,7 @@ public class EventQueue { * of the synchronized block to avoid deadlock when * event queues are nested with push()/pop(). */ - SunToolkit.flushPendingEvents(); + SunToolkit.flushPendingEvents(appContext); pushPopLock.lock(); try { for (int i = 0; i < NUM_PRIORITIES; i++) { @@ -873,7 +879,6 @@ public class EventQueue { newEventQueue.previousQueue = topQueue; topQueue.nextQueue = newEventQueue; - AppContext appContext = AppContext.getAppContext(); if (appContext.get(AppContext.EVENT_QUEUE_KEY) == topQueue) { appContext.put(AppContext.EVENT_QUEUE_KEY, newEventQueue); } @@ -934,7 +939,6 @@ public class EventQueue { topQueue.dispatchThread.setEventQueue(prevQueue); } - AppContext appContext = AppContext.getAppContext(); if (appContext.get(AppContext.EVENT_QUEUE_KEY) == this) { appContext.put(AppContext.EVENT_QUEUE_KEY, prevQueue); } @@ -1027,7 +1031,6 @@ public class EventQueue { final void initDispatchThread() { pushPopLock.lock(); try { - AppContext appContext = AppContext.getAppContext(); if (dispatchThread == null && !threadGroup.isDestroyed() && !appContext.isDisposed()) { dispatchThread = AccessController.doPrivileged( new PrivilegedAction() { @@ -1055,7 +1058,7 @@ public class EventQueue { /* * Minimize discard possibility for non-posted events */ - SunToolkit.flushPendingEvents(); + SunToolkit.flushPendingEvents(appContext); /* * This synchronized block is to secure that the event dispatch * thread won't die in the middle of posting a new event to the @@ -1114,7 +1117,7 @@ public class EventQueue { * removeNotify method. */ final void removeSourceEvents(Object source, boolean removeAllEvents) { - SunToolkit.flushPendingEvents(); + SunToolkit.flushPendingEvents(appContext); pushPopLock.lock(); try { for (int i = 0; i < NUM_PRIORITIES; i++) { diff --git a/src/share/classes/javax/swing/RepaintManager.java b/src/share/classes/javax/swing/RepaintManager.java index 8f2e609339368bb42d03e0b6981cea3b971a1546..461f93d5fc4fcc6c305efd3d0c9a96f80156fec5 100644 --- a/src/share/classes/javax/swing/RepaintManager.java +++ b/src/share/classes/javax/swing/RepaintManager.java @@ -354,7 +354,7 @@ public class RepaintManager // Queue a Runnable to invoke paintDirtyRegions and // validateInvalidComponents. - scheduleProcessingRunnable(); + scheduleProcessingRunnable(SunToolkit.targetToAppContext(invalidComponent)); } @@ -443,7 +443,7 @@ public class RepaintManager // Queue a Runnable to invoke paintDirtyRegions and // validateInvalidComponents. - scheduleProcessingRunnable(); + scheduleProcessingRunnable(SunToolkit.targetToAppContext(c)); } /** @@ -1389,10 +1389,6 @@ public class RepaintManager return paintManager; } - private void scheduleProcessingRunnable() { - scheduleProcessingRunnable(AppContext.getAppContext()); - } - private void scheduleProcessingRunnable(AppContext context) { if (processingRunnable.markPending()) { Toolkit tk = Toolkit.getDefaultToolkit(); diff --git a/src/share/classes/sun/awt/SunToolkit.java b/src/share/classes/sun/awt/SunToolkit.java index 62b20c9d39dde5189c0dfb51403132df86a42f32..2497a84ad8d3cb52ab7a94a08e43285bc458f1a1 100644 --- a/src/share/classes/sun/awt/SunToolkit.java +++ b/src/share/classes/sun/awt/SunToolkit.java @@ -97,6 +97,14 @@ public abstract class SunToolkit extends Toolkit */ public final static int MAX_BUTTONS_SUPPORTED = 20; + /** + * Creates and initializes EventQueue instance for the specified + * AppContext. + * Note that event queue must be created from createNewAppContext() + * only in order to ensure that EventQueue constructor obtains + * the correct AppContext. + * @param appContext AppContext to associate with the event queue + */ private static void initEQ(AppContext appContext) { EventQueue eventQueue;