[OpenJDK 2D-Dev] [12] Review Request: 8211992 GraphicsConfiguration.getDevice().getDisplayMode() causes JVM crash on Mac

Phil Race philip.race at oracle.com
Tue Oct 30 16:59:57 UTC 2018

Looks reasonable. A test is difficult, but I presume you did some testing.
Can you report the scenarios you tested and on which OS version ?

Did you try remove/add/remove, or add/remove/add ?
Did you try wake from sleep ?
Did you try removing a monitor whilst it was sleeping and then waking ?

All whilst a Java app was running of course - on the monitor being removed.


On 10/15/18 6:11 PM, Sergey Bylokhov wrote:
> Hello.
> Please review the fix for jdk 12.
> Bug: https://bugs.openjdk.java.net/browse/JDK-8211992
> Webrev: http://cr.openjdk.java.net/~serb/8211992/webrev.00
> Short description:
>   The root cause is how we use CoreGraphics display ID. This 
> identifier can become non-valid at any time therefore methods, which 
> is using this id should be ready to it. And this bug found a few 
> places which does not take care about the rule above.
> Long description:
>   In the CGraphicsDevice class we maintain the ID for the native 
> screen. This ID usually changed when the user adds/removes monitors to 
> the system. Since using invalid id can cause NULL result in the native 
> code we tries to workaround it by two steps:
>   Step (1) If the monitor is removed from the system, then we reassign 
> its displayid to the primary screen. So if the user will holds the 
> reference to this GDevice, it will use the MainDisplay. But note that 
> if the user will remove the main screen again then the old screen, 
> which were removed previously, will not be updated(but will use an 
> invalid displayid).
>   Step (2) Some of the native methods in CGraphicsDevice class are 
> ready to NULL and provide some meaningful defaults, like 72 dpi. But 
> some others methods are not ready for that, like 
> nativeGetDisplayMode/etc.
> Fix description:
>  - I have minimized/dropped the usage of displayid outside of 
> CGraphicsDevice class, in CRobot it was unused, and the code from 
> CGraphicsConfig.m was moved to CGraphicsDevice.m.
>  - In CGraphicsEnvironment class we now maintain the list of old 
> devices, which is updated for all _displayReconfiguration events. This 
> is the same implementation as on windows in Win32GraphicsEnvironment.java
>  - I have added some default values to all native methods also. Just 
> to cover the rare case when we call the method and displayid became 
> invalid at the same moment.

More information about the 2d-dev mailing list