<AWT Dev> Review request for 8165829: Android Studio 2.x crashes with NPE at sun.lwawt.macosx.CAccessibility.getAccessibleIndexInParent

Anton Tarasov anton.tarasov at jetbrains.com
Thu Sep 15 10:38:04 UTC 2016

Hi Sergey,

On 9/15/2016 1:28 PM, Sergey Bylokhov wrote:
> Why not all methods in CAccessibility are updated? For example what is 
> the difference between getAccessibleIndexInParent and getAccessibleParent?

The difference is that getAccessibleParent may return "null" to native 
which is expected and handled, whereas getAccessibleIndexInParent may 
throw NPE which is unexpected and not handled.
The problem occurs when unboxing null to a primitive wrapper 
(Integer/Boolean etc). I've changed only those methods.

> 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?

The new invokeAndWait returns _requested_ default value which seems 
better in general.


> On 15.09.16 12:45, Anton Tarasov wrote:
>> Hello,
>> 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.
>> Thanks,
>> Anton.

More information about the awt-dev mailing list