Ok, JDK8 then. But what do you think about the proposed way to simplify SunToolkit.flushPendingEvents(<u></u>)? Do you think it&#39;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">&lt;<a href="mailto:artem.ananiev@oracle.com" target="_blank">artem.ananiev@oracle.com</a>&gt;</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&#39;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 &amp;&amp; flushingThread == null;<br>
     }<br>
<br>
     public void flush() {<br>
         EventQueueItem tempQueue;<br>
         synchronized (this) {<br>
             while (flushingThread != null &amp;&amp; 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 &lt;<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@oracle.com</a><br></div></div>
&lt;mailto:<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@<u></u>oracle.com</a>&gt;&gt;<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 &amp;&amp; !isFlushing;<br>
             }<br>
<br>
        ... a thread calling noEvents could see occasional &quot;spikes&quot; 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 &lt;<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@oracle.com</a><br>
        &lt;mailto:<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@<u></u>oracle.com</a>&gt;<br></div>
        &lt;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>
        &lt;mailto:<a href="mailto:oleg.pekhovskiy@oracle.com" target="_blank">oleg.pekhovskiy@<u></u>oracle.com</a>&gt;&gt;&gt;<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>
        &lt;<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>&gt;<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>
        &lt;<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>&gt;<br>
        &lt;<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>
        &lt;<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>&gt;&gt;<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>
        &lt;<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>&gt;<br>
<br>
             Reviewers 7u6 &amp; 8:<br>
             Anthony Petrov, Anton Tarasov<br>
<br>
             Thanks,<br>
             Oleg<br>
<br>
<br>
<br>
<br>
</div></blockquote>
</blockquote></div><br></div>