On Mon, 26 Aug 2024 21:11:03 GMT, Kevin Rushforth <k...@openjdk.org> wrote:
> A Swing / FX interop app will crash if an application creates a new AWT / > Swing window after calling Platform.exit. The root cause of the crash is that > AWT caches the JNI env pointer for the AppKit thread, and assumes that it is > valid for the life of the application. In the case where JavaFX is the owner > of the NSApplication, we detach the AppKit thread from the JVM, after which > AWT's env pointer is no longer valid. AWT will therefore crash the next time > it does a JNI upcall. > > This PR fixes the crash by leaving the macOS AppKit thread attached to the > JVM after the JavaFX main event loop terminates. This requires attaching the > AppKit thread to the JVM as a daemon thread when JavaFX is the NSApplication > owner, matching what AWT does when it is the owner. In order to prevent a > JavaFX application from exiting prematurely, create a non-daemon "KeepAlive" > thread that can be terminated when the FX toolkit exits. This also solves a > somewhat-related problem where the JavaFX toolkit will exit prematurely if > the AWT toolkit is started first, and all AWT windows are disposed. > > This fix is in addition to the AWT fix: > [JDK-8190329](https://bugs.openjdk.org/browse/JDK-8190329) / > openjdk/jdk#20688. Either the AWT fix or the JavaFX fix is sufficient to > avoid this specific problem, but there is value in fixing it in both places, > so I cloned the AWT bug to create a JavaFX bug that we can use for this PR. > > Summary of the changes: > > * Attach the AppKit thread to the JVM as a daemon > * Do not detach the thread when the FX main event loop terminates > * Create and start a KeepAlive thread in MacApplication, when the FX toolkit > starts > * Terminate the KeepAlive thread when the FX toolkit finishes > > Testing: > > I created automated systems tests from the manual test programs in the bugs > as well as a test to ensure that we don't regress and exit prematurely in the > pure JavaFX case (which would happen without the KeepAlive thread). Two of > the new tests fail on macOS without the fix and pass with the fix. All three > pass on all platforms with the fix. @prsadhuk Can you be one of the reviewers? ------------- PR Comment: https://git.openjdk.org/jfx/pull/1545#issuecomment-2316216722