--- a/src/share/classes/sun/awt/SunToolkit.java Tue Oct 02 10:20:16 2012 +0400
+++ b/src/share/classes/sun/awt/SunToolkit.java Tue Oct 02 12:54:45 2012 +0400
@@ -1993,25 +1993,41 @@ class PostEventQueue {
private EventQueueItem queueTail = null;
private final EventQueue eventQueue;
+ // For the case when queue is cleared but events are not posted
+ private volatile boolean isFlushing = false;
+
PostEventQueue(EventQueue eq) {
eventQueue = eq;
}
public synchronized boolean noEvents() {
- return queueHead == null;
+ return queueHead == null && !isFlushing;
}
/*
* Continually post pending AWTEvents to the Java EventQueue. The method
* is synchronized to ensure the flush is completed before a new event
* can be posted to this queue.
- */
- public synchronized void flush() {
- EventQueueItem tempQueue = queueHead;
- queueHead = queueTail = null;
- while (tempQueue != null) {
- eventQueue.postEvent(tempQueue.event);
- tempQueue = tempQueue.next;
+ *
+ * 7177040: The method couldn't be wholly synchronized because of calls
+ * of EventQueue.postEvent() that uses pushPopLock, otherwise it could
+ * potentially lead to deadlock
+ */
+ public void flush() {
+ EventQueueItem tempQueue;
+ synchronized (this) {
+ tempQueue = queueHead;
+ queueHead = queueTail = null;
+ isFlushing = (tempQueue != null);
+ }
+ try {
+ while (tempQueue != null) {
+ eventQueue.postEvent(tempQueue.event);
+ tempQueue = tempQueue.next;
+ }
+ }
+ finally {
+ isFlushing = false;
}
}