[7u10] Review request for 7188708 - REGRESSION: closed/java/awt/EventQueue/PostEventOrderingTest.java fails
Oleg Pekhovskiy
oleg.pekhovskiy at oracle.com
Fri Sep 7 05:39:27 PDT 2012
Hi David,
I thought about that variant first, then something stopped me.
Anyway, it resolves the regression.
Please review the changes here:
http://cr.openjdk.java.net/~bagiras/7u10/7188708.2/
Thanks,
Oleg
9/7/2012 3:36 PM, David Holmes wrote:
> 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