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

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Thu Sep 15 10:50:18 UTC 2016


On 15.09.16 13:38, Anton Tarasov wrote:
> 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.

Yes, and my suggestion was to use the new method and default values 
everywhere instead of invokeAndWait(Callable,Component).

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


-- 
Best regards, Sergey.


More information about the awt-dev mailing list