[7u10] Review request for 7188708 - REGRESSION: closed/java/awt/EventQueue/PostEventOrderingTest.java fails

David Holmes david.holmes at oracle.com
Fri Sep 7 04:36:10 PDT 2012


Hi Oleg,

It seems to me that the original code has the

  isFlushingPendingEvents = false;

in the wrong place: it should only ever be cleared by an invocation that 
set it. So a simple reorganization of the code would achieve that:

  553     public static void flushPendingEvents()  {
  554         flushLock.lock();
  555         try {
  556             // Don't call flushPendingEvents() recursively
  557             if (!isFlushingPendingEvents) {
  558                 isFlushingPendingEvents = true;
+                     try {
     559                 AppContext appContext = AppContext.getAppContext();
     560                 PostEventQueue postEventQueue =
     561 
(PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
     562                 if (postEventQueue != null) {
     563                     postEventQueue.flush();
     564                 }
+                    } finally {
+                       isFlushingPendingEvents = false;
+                    }
  565             }
  566         } finally {
-567
  568             flushLock.unlock();
  569         }
  570     }

David
-----

On 7/09/2012 11:57 AM, Oleg Pekhovskiy wrote:
> Hi!
>
> Please review the fix for CR:
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7188708
>
> Webrev:
> http://cr.openjdk.java.net/~bagiras/7u10/7188708.1/
>
> The reason is that isFlushingPendingEvents in
> SunToolkit.flushPendingEvents() is reset
> after the first recursive call of flushPendingEvents(). Thus, if there
> are several pending events in PostEventQueue,
> recursion would be rejected only for the first event, allowing nested
> call of PostEventQueue.flush() after.
>
> To resolve the problem I added the counter "flushNestingLevel" instead
> of the flag "isFlushingPendingEvents".
> It's increased each time entering SunToolkit.flushPendingEvents() and
> decreased on exit.
> So, PostEventQueue.flush() method is called only when we enter
> SunToolkit.flushPendingEvents() for the first time
> within one thread.
>
> That fix was prepared ONLY for 7u10.
> For JDK 8 the fix for "CR7186109 - Simplify lock machinery for
> PostEventQueue & EventQueue" should cover this case.
>
> Thanks,
> Oleg



More information about the jdk7u-dev mailing list