On Fri, 27 Jun 2025 01:56:15 GMT, Anass Baya <[email protected]> wrote:
>> **Analysis:**
>>
>> We are encountering a race condition in the native code. While retrieving
>> the screen number by calling _getScreenImOn(), the window is disposed. As a
>> result, the AWT-Windows event loop processes the Dispose() call, which
>> triggers UnlinkObjects().
>> The race condition between the execution paths of these two native methods
>> sometimes causes an exception
>>
>> **Proposed Fix:**
>>
>> While it's possible to introduce a synchronization mechanism, it would not
>> offer any real benefit. The window will be disposed regardless, and we’ll
>> fall back to the default screen. This behavior is already handled in
>> WWindowPeer.java, where a workaround is in place to use the default device
>> when getScreenImOn() returns a non-existent screen number
>>
>>
>> public void updateGC() {
>>
>> int scrn = getScreenImOn();
>>
>> if (screenLog.isLoggable(PlatformLogger.Level.FINER)) {
>> log.finer("Screen number: " + scrn);
>> }
>>
>> // get current GD
>> Win32GraphicsDevice oldDev = winGraphicsConfig.getDevice();
>>
>> Win32GraphicsDevice newDev;
>> GraphicsDevice[] devs = GraphicsEnvironment
>> .getLocalGraphicsEnvironment()
>> .getScreenDevices();
>>
>> // Occasionally during device addition/removal getScreenImOn can return
>> // a non-existing screen number. Use the default device in this case.
>> if (scrn >= devs.length) {
>> newDev = (Win32GraphicsDevice) GraphicsEnvironment
>> .getLocalGraphicsEnvironment().getDefaultScreenDevice();
>> } else {
>> newDev = (Win32GraphicsDevice) devs[scrn];
>> }
>> }
>>
>>
>> Therefore, I propose modifying the native method getScreenImOn to return the
>> default device if the peer is being disposed :
>>
>> jint AwtWindow::_GetScreenImOn(void *param)
>> {
>> ...
>> jboolean destroyed = JNI_GET_DESTROYED(self);
>> if (destroyed == JNI_TRUE){
>> env->DeleteGlobalRef(self);
>> return AwtWin32GraphicsDevice::GetDefaultDeviceIndex();
>> }
>> ...
>>
>>
>> **Tests Summary:**
>>
>> GetGraphicsStressTest (existing test):
>>
>> Fails intermittently without the fix
>>
>> Consistently passes with the fix
>>
>> NotifyStressTest (newly added test):
>>
>> Consistently fails without the fix
>>
>> Consistently passes with the fix
>
> Anass Baya has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Remove trailing space
Marked as reviewed by serb (Reviewer).
-------------
PR Review: https://git.openjdk.org/jdk/pull/25619#pullrequestreview-2969860404