Why not all methods in CAccessibility are updated? For example what is the difference between getAccessibleIndexInParent and getAccessibleParent? I think that it will be strange if getLocationOnScreen() will return null? Probably the old invokeAndWait(Callable,Component) should be updated to use this def value?

On 15.09.16 12:45, Anton Tarasov wrote:

Please review the fix:

bug: https://bugs.openjdk.java.net/browse/JDK-8165829
webrev: http://cr.openjdk.java.net/~ant/JDK-8165829/jdk9/webrev.0

(The bug is currently closed as “not an issue”, which is not quite true.
So once and if the fix is approved I can take the ownership of the bug).

The problem is this. Sometimes when a frame is closed there may appear a
race condition:

- removeNotify() is called on the frame on EDT and it removes all the
events associated with the frame from the event queue.

- The frame is requested by accessibility via the CAccessibility static
methods (like CAccessibility.getAccessibleIndexInParent). Those methods
are called from native on AppKit thread and they perform via
invokeAndWait. The latter is wrapped with an InvocationEvent whose
source is set to the frame. But, once the event is put on the event
queue, it's purged by the removeNotify() call. As the result,
invokeAndWait returns null. Then, in some of the mentioned methods
'null' is unboxed to a primitive 'int' or 'boolean' which results in NPE
propagated to native. On the native side, the NPE is not properly
handled and is just re-thrown.

I don't have a simple and safe solution for the race. So, I suggest to
fix the NPE/crash at least.


Best regards, Sergey.

Reply via email to