Ok, JDK8 then. But what do you think about the proposed way to simplify SunToolkit.flushPendingEvents(<u></u>)? Do you think it's wise to merge the recursion prevention with synchronization in PostEventQueue so that SunToolkit static methods are just a facade?<div>
<br></div><div>Regards, Peter<br><br><div class="gmail_quote">2012/7/24 Artem Ananiev <span dir="ltr"><<a href="mailto:artem.ananiev@oracle.com" target="_blank">artem.ananiev@oracle.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi, Peter,<br>
<br>
7177040 is about deadlock between EventQueue and PostEventQueue, it's not considered to simplify SunToolkit.flushPendingEvents(<u></u>). Please, expect flushLock changes in JDK8 as a part of the fix for 7186109.<br>
<br>
Thanks,<br>
<br>
Artem<div><div class="h5"><br>
<br>
On 7/24/2012 6:32 PM, Peter Levart wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
Ok, now to get rid of flushLock in SunToolkit so that flushPendingEvents<br>
is written as plain:<br>
<br>
public static void flushPendingEvents() {<br>
AppContext appContext = AppContext.getAppContext();<br>
PostEventQueue postEventQueue =<br>
(PostEventQueue)appContext.<u></u>get(POST_EVENT_QUEUE_KEY);<br>
if (postEventQueue != null) {<br>
postEventQueue.flush();<br>
}<br>
}<br>
<br>
... you could merge the recursion prevention functionality into the<br>
PostEventQueue in a manner similar to this:<br>
<br>
class PostEventQueue {<br>
private EventQueueItem queueHead = null;<br>
private EventQueueItem queueTail = null;<br>
private final EventQueue eventQueue;<br>
<br>
// For the recursion prevention and noEvents() status<br>
private Thread flushingThread = null;<br>
<br>
PostEventQueue(EventQueue eq) {<br>
eventQueue = eq;<br>
}<br>
<br>
public synchronized boolean noEvents() {<br>
return queueHead == null && flushingThread == null;<br>
}<br>
<br>
public void flush() {<br>
EventQueueItem tempQueue;<br>
synchronized (this) {<br>
while (flushingThread != null && flushingThread !=<br>
Thread.currentThread()) try {<br>
wait();<br>
}<br>
catch (InterruptedException e) { // what can we do?<br>
Thread.currentThread().<u></u>interrupt();<br>
return;<br>
}<br>
<br>
// prevent recursion<br>
if (flushingThread == Thread.currentThread()) return;<br>
<br>
tempQueue = queueHead;<br>
queueHead = queueTail = null;<br>
<br>
// queue was empty<br>
if (tempQueue == null) return;<br>
<br>
flushingThread = Thread.currentThread();<br>
notify();<br>
}<br>
try {<br>
while (tempQueue != null) {<br>
eventQueue.postEvent(<u></u>tempQueue.event);<br>
tempQueue = tempQueue.next;<br>
}<br>
}<br>
finally {<br>
synchronized (this) {<br>
flushingThread = null;<br>
notify();<br>
}<br>
}<br>
}<br>
<br>
/*<br>
* Enqueue an AWTEvent to be posted to the Java EventQueue.<br>
*/<br>
void postEvent(AWTEvent event) {<br>
EventQueueItem item = new EventQueueItem(event);<br>
<br>
synchronized (this) {<br>
if (queueHead == null) {<br>
queueHead = queueTail = item;<br>
} else {<br>
queueTail.next = item;<br>
queueTail = item;<br>
}<br>
}<br>
SunToolkit.wakeupEventQueue(<u></u>eventQueue, event.getSource() ==<br>
AWTAutoShutdown.getInstance())<u></u>;<br>
}<br>
} // class PostEventQueue<br>
<br>
<br>
What do you think?<br>
<br>
Regards, Peter<br>
<br>
<br>
2012/7/24 Oleg Pekhovskiy <<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@oracle.com</a><br></div></div>
<mailto:<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@<u></u>oracle.com</a>>><div class="im"><br>
<br>
Hi Peter,<br>
<br>
so obvious, thank you!<br>
<br>
Oleg.<br>
<br>
<br>
7/24/2012 3:42 PM, Peter Levart wrote:<br>
<br>
Hi Oleg,<br>
<br>
This is just cosmetics, but:<br>
<br>
SunToolkit:<br>
public synchronized boolean noEvents() {<br>
return queueHead == null && !isFlushing;<br>
}<br>
<br>
... a thread calling noEvents could see occasional "spikes" of<br>
false return even though there is no flushing being performed<br>
(when other thread is calling flush on an empty PostEventQueue).<br>
<br>
Improved flush method would look like this:<br>
<br>
public void flush() {<br>
EventQueueItem tempQueue;<br>
synchronized (this) {<br>
tempQueue = queueHead;<br>
queueHead = queueTail = null;<br>
isFlushing =*/(tempQueue != null)/*;<br>
<br>
}<br>
try {<br>
while (tempQueue != null) {<br></div>
eventQueue.postEvent(__<u></u>tempQueue.event);<div class="im"><br>
tempQueue = tempQueue.next;<br>
}<br>
}<br>
finally {<br>
isFlushing = false;<br>
}<br>
}<br>
<br>
Regards, Peter<br>
<br>
2012/7/23 Oleg Pekhovskiy <<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@oracle.com</a><br>
<mailto:<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@<u></u>oracle.com</a>><br></div>
<mailto:<a href="mailto:oleg.pekhovskiy@" target="_blank">oleg.pekhovskiy@</a>__<a href="http://oracle.com" target="_blank">orac<u></u>le.com</a><div class="im"><br>
<mailto:<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@<u></u>oracle.com</a>>>><br>
<br>
<br>
Hi!<br>
<br>
Please review this back-port being already pushed to jdk8 but<br>
deferred for 7u6.<br>
<br>
Bug:<br></div>
<a href="http://bugs.sun.com/view_bug.__do?bug_id=7177040" target="_blank">http://bugs.sun.com/view_bug._<u></u>_do?bug_id=7177040</a><br>
<<a href="http://bugs.sun.com/view_bug.do?bug_id=7177040" target="_blank">http://bugs.sun.com/view_bug.<u></u>do?bug_id=7177040</a>><br>
<br>
Webrev:<br>
<a href="http://cr.openjdk.java.net/~__bagiras/7u8/7177040.1" target="_blank">http://cr.openjdk.java.net/~__<u></u>bagiras/7u8/7177040.1</a><br>
<<a href="http://cr.openjdk.java.net/~bagiras/7u8/7177040.1" target="_blank">http://cr.openjdk.java.net/~<u></u>bagiras/7u8/7177040.1</a>><br>
<<a href="http://cr.openjdk.java.net/%__7Ebagiras/7u8/7177040.1" target="_blank">http://cr.openjdk.java.net/%_<u></u>_7Ebagiras/7u8/7177040.1</a><div class="im"><br>
<<a href="http://cr.openjdk.java.net/%7Ebagiras/7u8/7177040.1" target="_blank">http://cr.openjdk.java.net/%<u></u>7Ebagiras/7u8/7177040.1</a>>><br>
<br>
<br>
Review thread for 7u6:<br></div>
<a href="http://mail.openjdk.java.net/__pipermail/awt-dev/2012-July/__003106.html" target="_blank">http://mail.openjdk.java.net/_<u></u>_pipermail/awt-dev/2012-July/_<u></u>_003106.html</a><div class="im"><br>
<<a href="http://mail.openjdk.java.net/pipermail/awt-dev/2012-July/003106.html" target="_blank">http://mail.openjdk.java.net/<u></u>pipermail/awt-dev/2012-July/<u></u>003106.html</a>><br>
<br>
Reviewers 7u6 & 8:<br>
Anthony Petrov, Anton Tarasov<br>
<br>
Thanks,<br>
Oleg<br>
<br>
<br>
<br>
<br>
</div></blockquote>
</blockquote></div><br></div>