[OpenJDK 2D-Dev] RFR: 6847157: java.lang.NullPointerException: HDC for component at sun.java2d.loops.Blit.Blit

Sergey Bylokhov serb at openjdk.java.net
Mon Oct 26 20:04:34 UTC 2020


On Mon, 26 Oct 2020 19:45:49 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:

> This is the fix for one suspicious exception which rarely but time to time occurred on the test systems. As described in a few bug reports the use-cases could be quite different, but I was able to reproduce it in one of them.
> 
> Steps to reproduce:
>  1. We draw to the frame for the first time or we draw to the frame on the thread where we never draw before
>  2. As part of step 1. we start initialization of the surface data bounded to this frame for that thread, in the native method
>  3. jtreg decided to kill the test because the main method ends
>  4. As part of step 2. we request HDC for the frame via sendMessage which do nothing since AWT is stopping/dies -> HDC=NULL
>  5. As part of step 1. we try to draw to the surface -> HDC is NULL -> NPE is thrown
> 
> The solution is to mark the surface at step 4. as invalid:
>  - If the AWT will die this surface will never be used and no exception occurs
>  - If the application will continue to work and this surface will be accessed then we will throw InvalidPipeException in attempts to recreate the surface and all related data.

test/jdk/java/awt/Paint/RepaintOnAWTShutdown.java line 51:

> 49:  * @run main/othervm -Dsun.java2d.uiScale=2.25 RepaintOnAWTShutdown
> 50:  * @run main/othervm -Dsun.java2d.uiScale=5    RepaintOnAWTShutdown
> 51:  * @run main/othervm -Dsun.java2d.uiScale=10   RepaintOnAWTShutdown

The bug depends on the CPU/GPU performance so I tried to reproduce it by tweaking the number of pixels to draw.

-------------

PR: https://git.openjdk.java.net/jdk/pull/870


More information about the 2d-dev mailing list