Hi, Phil.
I completely forgot about that version of the fix, here are my thoughts about
it.
It does not fix the test in question, it is still executed too slow, and fails
by the
timeout, the reason is that it does not take into account the blocked events
when DnD
is active.
That version had two parts:
- The code which avoids the deadlock(actually it avoid an infinite waiting):
http://cr.openjdk.java.net/~pchelko/9/7185258/webrev.01/src/macosx/native/sun/osxapp/NSApplicationAWT.m.sdiff.html
That was already fixed as part of JDK-8080504, and this is why I cannot
reproduce it now:
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/e06161762a72
- The part which tried to tweak the default timeout and had some code to stop
waiting:
http://cr.openjdk.java.net/~pchelko/9/7185258/webrev.01/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java.sdiff.html
If I understand the code above correctly then on EDT it will wait no more
than 500 ms,
and in other cases will wait till the timeout, the same could be achieved
w/o the loop by the:
if (EventQueue.isDispatchThread()) {
// do not block EDT for a long time
timeout = XX;
}
return nativeSyncQueue(timeout);
I think that it could be useful to minimize blocking EDT, so decided to merge
this part to the current fix:
http://cr.openjdk.java.net/~serb/7185258/webrev.02/
On 4/7/20 3:04 pm, Philip Race wrote:
There were previous attempts to fix this on mac :
https://mail.openjdk.java.net/pipermail/awt-dev/2013-December/006719.html
https://mail.openjdk.java.net/pipermail/awt-dev/2014-January/006809.html
https://mail.openjdk.java.net/pipermail/awt-dev/2014-February/007047.html
which you reviewed. Can you comment on how the current proposal avoids
the problems raised there ?
-phil.
On 4/6/20, 12:20 AM, Sergey Bylokhov wrote:
Hello.
Please review the fix for jdk/client.
Bug: https://bugs.openjdk.java.net/browse/JDK-7185258
Fix: http://cr.openjdk.java.net/~serb/7185258/webrev.01
The Robot.waitForIdle and SunToolKit.realSync() may hang if executed when DnD is
in progress, because they posts native events to the application and waits when
these event will be dispatched. During DnD this events are blocked, so every
call
to waitForIdle will hang for a timeout(which is 10 seconds) per native event
check.
This may appear as a deadlock.
The similar bug was fixed on windows:
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/7658a78a93de
Solution on macOS is similar, skips the native checks when the DnD is in
progress.
--
Best regards, Sergey.