There are a number of ways to solve this, e.g.
* get rid of the separate shutdown procedure in the system tests.
The utility was added to have a consistent way to shut down the
platform, so it would seem a shame to remove it.
* set Platform.setImplicitExit(false) which will prevent tkExit being
called when the last window is gone
I doubt we want to run most systems tests with setImplicitExit(false).
* add more safety in test.util.Shutdown so that it doesn't try to use
the FX App thread when that is not accepting new runnables
* ...
This seems best, if not too hard to implement. My quick thought on this
is to add a package scope method to PlatformImpl (with a corresponding
method in PlatformImplShim) to return the toolkitExit flag, which
indicates whether or not the toolkit is running.
A fourth option might be to change the runAndWait to runLater, thus
making it asynchronous. We would need to test whether this causes any
stability problems on shutdown.
-- Kevin
On 4/24/2024 4:42 AM, Johan Vos wrote:
While working on the systemtests for the Headless platform, I noticed
timing issues with the Marlin QPath Test. Those have nothing to do
with Marlin, but rather with the lifecycle. After the test ran,
`test.util.Shutdown` is invoked (not on the JavaFX app thread). I
noticed that this caused a timeout almost always when running the
systemtest with the headless platform, and almost never when running
with the regular (Gtk) platform.
The problem is that the `test.util.Shutdown` method is invoking
Platform.runLater() but in some cases (almost always in Headless and
almost never in GTK) the runLater is not accepting runnables anymore.
This happens because of the PlatformImpl.checkIdle which will shutdown
the platform in case there are no windows and no pending runnables
(and a few more conditions). This check runs on the JavaFX app thread,
and it might trigger `tkExit` before the test-thread invokes
`test.util.Shutdown`.
There are a number of ways to solve this, e.g.
* get rid of the separate shutdown procedure in the system tests.
* set Platform.setImplicitExit(false) which will prevent tkExit being
called when the last window is gone
* add more safety in test.util.Shutdown so that it doesn't try to use
the FX App thread when that is not accepting new runnables
* ...
Thoughts?
- Johan