On Mon, 15 Jul 2024 19:36:43 GMT, Kevin Rushforth <k...@openjdk.org> wrote:

> This PR solves two related bugs that are caused by events being delivered 
> while the FX runtime is in the process of shutting down. These bugs are 
> related enough that I think they need to be addressed at the same time. While 
> debugging and developing the test, I saw one or the other or both in various 
> test runs. The system test included with this program verifies that there is 
> no crash and no exception, so will catch either failure mode.
> 
> This can happen when there is a full-screen window showing during shutdown on 
> macOS, since full screen enter / exit uses a nested event loop that affects 
> the order of operation. This could theoretically happen in other cases, thus 
> the fix does not involve checking whether we are in full-screen or whether 
> there is a nested event loop.
> 
> The fix does the following:
> 
> 1. `GlassWindow+Overrides.m`: Check that the JVM is still running before 
> calling the Java notification method in `windowDidResignKey` and 
> `windowShouldClose`. This matches what is already done for other similar 
> methods in this class. This is the fix for JDK-8335630.
> 2. `Window.java` and `View.java`: Check whether the Application instance is 
> null in the event notification callbacks, and skip handling the event if it 
> is. This is the fix for JDK-8299738.
> 
> Note that the fix for 2 is in platform-independent code. This should be fine, 
> since we would want to skip the event handling callback on any other platform 
> if it were done during shutdown, in order to avoid the ISE.
> 
> I have included a system test that passes on all platforms. On macOS, the 
> test will fail without the fix and pass with the fix.
> 
> Details of the fix are below:
> 
> `Platform::exit` is called by the application to shutdown the JavaFX toolkit. 
> The implementation of `Platform::exit` calls `Toolkit::exit` on the JavaFX 
> Application thread, which in turn calls glass `Application::terminate` to 
> shut it down. `Application::terminate` will close all the native windows, and 
> call `finishTerminating` to terminate the native event loop and detach the 
> thread from the JVM. This is asynchronous, at least on macOS, and will 
> schedule the termination by posting a native event to the event loop.
> 
> on macOS 13, and sometimes on macOS 14, a Window or View event handler can be 
> called between `Toolkit::exit`/`Application::terminate` (which sets the 
> Toolkit's cached thread to null and the glass Application instance to null) 
> and the JVM shutdown. This will make a JNI upcall to the appropriate Window 
> or View `handleXxxxx` method, which...

This pull request has now been integrated.

Changeset: 81f11c4a
Author:    Kevin Rushforth <k...@openjdk.org>
URL:       
https://git.openjdk.org/jfx/commit/81f11c4a39eb505d17c57a49c5e084f75a169856
Stats:     157 lines in 4 files changed: 130 ins; 0 del; 27 mod

8335630: Crash if Platform::exit called with fullScreen Stage on macOS 14
8299738: ISE if Platform::exit called with fullScreen Stage on macOS 13

Reviewed-by: angorya, mstrauss

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

PR: https://git.openjdk.org/jfx/pull/1506

Reply via email to