<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 08:19:56 PDT 2012
Ok, JDK8 then. But what do you think about the proposed way to simplify
SunToolkit.flushPendingEvents(**)? Do you think it's wise to merge the
recursion prevention with synchronization in PostEventQueue so that
SunToolkit static methods are just a facade?
Regards, Peter
2012/7/24 Artem Ananiev <artem.ananiev at oracle.com>
> Hi, Peter,
>
> 7177040 is about deadlock between EventQueue and PostEventQueue, it's not
> considered to simplify SunToolkit.flushPendingEvents(**). Please, expect
> flushLock changes in JDK8 as a part of the fix for 7186109.
>
> Thanks,
>
> Artem
>
>
> On 7/24/2012 6:32 PM, Peter Levart wrote:
>
>> 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
>> <mailto:oleg.pekhovskiy@**oracle.com <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>
>> >
>> <mailto:oleg.pekhovskiy at __orac**le.com <http://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>
>> <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/~**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<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>
>>
>> <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/bc2b1519/attachment.html
More information about the awt-dev
mailing list