<AWT Dev> [8] Review request for 7186109: Simplify lock machinery for PostEventQueue & EventQueue
Anthony Petrov
anthony.petrov at oracle.com
Wed Aug 29 04:22:18 PDT 2012
On 8/29/2012 3:08 PM, Anthony Petrov wrote:
> Hi Oleg,
>
> I'm still concerned about the following:
>
> detachDispatchThread()
> {
> flush();
> lock();
> // possibly detach
> unlock();
> }
>
> at EventQueue.java. What if an even get posted to the queue after the
A typo: s/even get/event gets/.
--
best regards,
Anthony
> flush() returns but before we even acquired the lock? We may still end
> up with a situation when we detach the thread while in fact there are
> some pending events present, which actually contradicts the current
> logic of the detach() method. I see that you say "Minimize discard
> possibility" in the comment instead of "Prevent ...", but I feel
> uncomfortable with this actually.
>
> What exactly prevents us from adding some synchronization to ensure that
> the detaching only happens when there's really no pending events?
>
> SunToolkit.java:
>> 2120 Boolean b = isThreadLocalFlushing.get();
>> 2121 if (b != null && b) {
>> 2122 return;
>> 2123 }
>> 2124 2125 isThreadLocalFlushing.set(true);
>> 2126 try {
>
> How does access to the isThreadLocalFlushing synchronized? What happens
> if the flush() is being invoked from two different threads for the same
> post event queue? Why do we have two "isFlushing" flags? Can we collapse
> them into one? Why is the isFlushing set/reset in two disjunct
> synchronized(){} blocks?
>
> Overall, I find the current synchronization scheme in flush() very,
> *very* (and I mean it) confusing. Can we simplify it somehow?
>
> --
> best regards,
> Anthony
>
> On 8/28/2012 6:33 PM, Oleg Pekhovskiy wrote:
>> Hi Artem, Anthony,
>>
>> thank you for your proposals!
>>
>> We with Artem also had off-line discussion,
>> so as a result I prepared improved version of fix:
>> http://cr.openjdk.java.net/~bagiras/8/7186109.3/
>>
>> What was done:
>> 1. EventQueue.detachDispatchThread(): moved
>> SunToolkit.flushPnedingEvents() above the comments and added a
>> separate comment to it.
>> 2. Moved SunToolkitSubclass.flushPendingEvents(AppContext) method to
>> SunToolkit. Deleted SunToolkitSubclass.
>> 3. Moved isFlushingPendingEvents to PostEventQueue with the new name -
>> isThreadLocalFlushing and made it ThreadLocal.
>> 4. Left PostEventQueue.flush() unsynchronized and created
>> wait()-notifyAll() synchronization mechanism to avoid blocking of
>> PostEventQueue.postEvent().
>>
>> Looking forward to your comments!
>>
>> Thanks,
>> Oleg
>>
>> 20.08.2012 20:20, Artem Ananiev wrote:
>>> Hi, Oleg,
>>>
>>> here are a few comments:
>>>
>>> 1. What is the reason of keeping "isFlushingPendingEvents" in
>>> SunToolkit, given that PEQ.flush() is synchronized (and therefore
>>> serialized) anyway?
>>>
>>> 2. flushPendingEvents(AppContext) may be moved directly to
>>> SunToolkit, so we don't need a separate sun-class for that.
>>>
>>> 3. EQ.java:1035-1040 - this comment is obsolete and must be replaced
>>> by another one.
>>>
>>> Thanks,
>>>
>>> Artem
>>>
>>> On 8/17/2012 4:49 PM, Oleg Pekhovskiy wrote:
>>>> Hi!
>>>>
>>>> Please review the fix for CR:
>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7186109
>>>>
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~bagiras/8/7186109.1/
>>>>
>>>> The following changes were made:
>>>> 1. Removed flushLock from SunToolkit.flushPendingEvent()
>>>> 2. Returned method PostEventQueue.flush() as 'synchronized' back
>>>> 3. Added call of SunToolkit.flushPendingEvents() to
>>>> EventQueue.detachDispatchThread(),
>>>> right before pushPopLock.lock()
>>>> 4. Removed !SunToolkit.isPostEventQueueEmpty() check from
>>>> EventQueue.detachDispatchThread()
>>>> 5. Removed SunToolkit.isPostEventQueueEmpty() &
>>>> PostEventQueue.noEvents();
>>>>
>>>> Thanks,
>>>> Oleg
>>>> <http://cr.openjdk.java.net/%7Ebagiras/8/7186109.1/>
>>
>>
More information about the awt-dev
mailing list