> **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 three additional commits since the last revision: - BogusFocusableWindowState -2- - Add BogusFocusableWindowState - Delete NotifyStressTest ------------- Changes: - all: https://git.openjdk.org/jdk/pull/25619/files - new: https://git.openjdk.org/jdk/pull/25619/files/9103d253..0a02b31e Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=25619&range=08 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=25619&range=07-08 Stats: 119 lines in 2 files changed: 50 ins; 69 del; 0 mod Patch: https://git.openjdk.org/jdk/pull/25619.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/25619/head:pull/25619 PR: https://git.openjdk.org/jdk/pull/25619