<AWT Dev> [7u8] Review request for 7177040: Deadlock between PostEventQueue.noEvents, EventQueue.isDispatchThread and SwingUtilities.invokeLater
Peter Levart
peter.levart at gmail.com
Tue Jul 24 07:32:13 PDT 2012
Ok, now to get rid of flushLock in SunToolkit so that flushPendingEvents is
written as plain:
public static void flushPendingEvents() {
AppContext appContext = AppContext.getAppContext();
PostEventQueue postEventQueue =
(PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
if (postEventQueue != null) {
postEventQueue.flush();
}
}
... you could merge the recursion prevention functionality into the
PostEventQueue in a manner similar to this:
class PostEventQueue {
private EventQueueItem queueHead = null;
private EventQueueItem queueTail = null;
private final EventQueue eventQueue;
// For the recursion prevention and noEvents() status
private Thread flushingThread = null;
PostEventQueue(EventQueue eq) {
eventQueue = eq;
}
public synchronized boolean noEvents() {
return queueHead == null && flushingThread == null;
}
public void flush() {
EventQueueItem tempQueue;
synchronized (this) {
while (flushingThread != null && flushingThread !=
Thread.currentThread()) try {
wait();
}
catch (InterruptedException e) { // what can we do?
Thread.currentThread().interrupt();
return;
}
// prevent recursion
if (flushingThread == Thread.currentThread()) return;
tempQueue = queueHead;
queueHead = queueTail = null;
// queue was empty
if (tempQueue == null) return;
flushingThread = Thread.currentThread();
notify();
}
try {
while (tempQueue != null) {
eventQueue.postEvent(tempQueue.event);
tempQueue = tempQueue.next;
}
}
finally {
synchronized (this) {
flushingThread = null;
notify();
}
}
}
/*
* Enqueue an AWTEvent to be posted to the Java EventQueue.
*/
void postEvent(AWTEvent event) {
EventQueueItem item = new EventQueueItem(event);
synchronized (this) {
if (queueHead == null) {
queueHead = queueTail = item;
} else {
queueTail.next = item;
queueTail = item;
}
}
SunToolkit.wakeupEventQueue(eventQueue, event.getSource() ==
AWTAutoShutdown.getInstance());
}
} // class PostEventQueue
What do you think?
Regards, Peter
2012/7/24 Oleg Pekhovskiy <oleg.pekhovskiy at oracle.com>
> Hi Peter,
>
> so obvious, thank you!
>
> Oleg.
>
>
> 7/24/2012 3:42 PM, Peter Levart wrote:
>
>> Hi Oleg,
>>
>> This is just cosmetics, but:
>>
>> SunToolkit:
>> public synchronized boolean noEvents() {
>> return queueHead == null && !isFlushing;
>> }
>>
>> ... a thread calling noEvents could see occasional "spikes" of false
>> return even though there is no flushing being performed (when other thread
>> is calling flush on an empty PostEventQueue).
>>
>> Improved flush method would look like this:
>>
>> 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;
>> }
>> }
>>
>> Regards, Peter
>>
>> 2012/7/23 Oleg Pekhovskiy <oleg.pekhovskiy at oracle.com <mailto:
>> oleg.pekhovskiy@**oracle.com <oleg.pekhovskiy at oracle.com>>>
>>
>>
>> Hi!
>>
>> Please review this back-port being already pushed to jdk8 but
>> deferred for 7u6.
>>
>> Bug:
>> http://bugs.sun.com/view_bug.**do?bug_id=7177040<http://bugs.sun.com/view_bug.do?bug_id=7177040>
>>
>> Webrev:
>> http://cr.openjdk.java.net/~**bagiras/7u8/7177040.1<http://cr.openjdk.java.net/~bagiras/7u8/7177040.1>
>> <http://cr.openjdk.java.net/%**7Ebagiras/7u8/7177040.1<http://cr.openjdk.java.net/%7Ebagiras/7u8/7177040.1>
>> >
>>
>>
>> Review thread for 7u6:
>> http://mail.openjdk.java.net/**pipermail/awt-dev/2012-July/**
>> 003106.html<http://mail.openjdk.java.net/pipermail/awt-dev/2012-July/003106.html>
>>
>> Reviewers 7u6 & 8:
>> Anthony Petrov, Anton Tarasov
>>
>> Thanks,
>> Oleg
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/awt-dev/attachments/20120724/335cc090/attachment.html
More information about the awt-dev
mailing list