I will look at this tomorrow due to the short time window. Haven't kept up
with this thread.

On Fri, Jan 19, 2024 at 10:34 PM Kevin Rushforth <kevin.rushfo...@oracle.com>
wrote:

> Hi Jurgen,
>
> There is a very short window for making any changes like this that
> require a CSR in JavaFX 22. If we were to do what you suggest, we would
> need to:
>
> 1. File a new Enhancement request to:
> -- revert JDK-8159048 (except for the doc changes about Animation being
> run on the FX application thread, which is correct and useful even after
> the revert)
> -- update the documentation to indicate that the play/pause/stop methods
> may be called on any thread
> -- fix the implementation to wrap the implementation of play/pause/stop
> in Platform.runLater, if not on the FX app thread
> -- we may or may not also want to make the additional fix you suggest
> in AbstractPrimaryTimer, but this might not be needed if we wrap the
> call in a runLater, which I think should be done anyway
>
> 2. File a CSR  for the spec changes for the above
>
> All of this would need to be agreed upon and proposed within the next
> few days to allow time for the CSR to be considered and approved while
> we are still in RDP1. I would not consider such a change once we hit
> RDP2 on Feb 1.
>
> Before even considering this, I'd like to hear from Johan Vos, Jose
> Pereda (who implemented JDK-8159048), Nir Lisker (who has done a lot of
> work on animation), and Michael Strauß (who has proposed in JDK-8324219
> to update the documentation to remove the reference to the fact that
> stop is asynchronous), and any others who might have an interest. Note
> that if we go down the route of reverting JDK-8159048, then we will
> close JDK-8324219 as "not an issue".
>
> If there is general agreement, then it would seem reasonable to shoot
> for JavaFX 22. I note that it would be a low- risk change -- basically
> going back to the behavior we have in JavaFX 21, which is the latest GA
> release.
>
> -- Kevin
>
>
> On 1/19/2024 4:06 AM, Jurgen Doll wrote:
> > Hi Kevin
> >
> > I was hoping that others would way in on this fix (PR #1167), but now
> > that we're in RDP1 with no other input coming in I decided to looked
> > into this matter again and have found that this is not the correct
> > solution for the following two reasons:
> >
> > 1. The current solution doesn't actually fix the bug, but merely
> > avoids it:
> >
> > Specifically with regards to bug JDK-8159048 which reports a NPE
> > occuring under some conditions in AbstractMasterTimer (subsequently
> > renamed to AbstractPrimaryTimer). The reporter suggests that this is
> > as a result of some concurrent modification occurring and suggests a
> > workaround of wrapping the start/stop animation code in a
> > Platform.runLater() call.
> >
> > Looking at the AbstractPrimaryTimer code it is apparent that the
> > original author made an effort to isolate array modifications from
> > array access. However this code has a bug in it which then manifests
> > as a NPE under the right timing conditions. So the correct solution is
> > to make the array modification code more robust, as apposed to forcing
> > changes to occur on a single thread.
> >
> > The safest (and proper) solution is to convert the two arrays
> > ("receivers" and "animationTimers") to be CopyOnWriteArrayList(s)
> > which is an ideal JDK data structure for this use case as it
> > replicates the intended behavior of the current implementation. (I've
> > tried this out and it does solve the NPE problem.)
> >
> > 2. The current solution is based on the misconception that start,
> > stop, and pause must occur on the FX thread:
> >
> > Specifically with regards to the CSR JDK-8313378 which makes this claim.
> >
> > Firstly the Animation API says explicitly that these methods are
> > asynchronous, which means that the thread that invokes these methods
> > and the actual execution of the animation occurs on different threads,
> > and looking at AbstractPrimaryTimer code it can be seen that this is
> > indeed the case.
> >
> > Secondly JavaFX had tests, as noted in JDK-8314266, that have run
> > reliably for years without invoking these methods on the FX thread.
> > FWIW I've also had code and used libraries for years now, where these
> > methods have been invoked on a background thread (for example while
> > loading FXML) without issue.
> >
> >
> > In conclusion then I request permission to submit a new PR containing
> > the following changes:
> >
> > 1. Revert PR #1167 (if this is the appropriate place, however the test
> > case will require it)
> > 2. Changing the arrays in AbstractPrimaryTimer to be
> > CopyOnWriteArrayList(s) and removing previously supporting array code.
> > 3. Adding a test based on the one supplied in JDK-8159048 to check
> > that a NPE isn't thrown anymore.
> >
> > Hope this meets with your approval.
> > Regards,
> > Jurgen
> >
> >
> >>   On 8/18/2023 4:17 PM, Kevin Rushforth wrote:
> >> As a heads-up for app developers who use JavaFX animation (including
> >> Animation, along with any subclasses, and AnimationTimer), a change
> >> went into the JavaFX 22+5 build to enforce that the play, pause, and
> >> stop methods must be called on the JavaFX Application thread.
> >> Applications should have been doing that all along (else they would
> >> have been subject to unpredictable errors), but for those who aren't
> >> sure, you might want to take 22+5 for a spin and see if you have any
> >> problems with your application. Please report them on the list if you
> >> do.
> >>
> >> See JDK-8159048 [1] and CSR JDK-8313378 [2] for more information on
> >> this change.
> >>
> >> Thanks.
> >>
> >> -- Kevin
> >>
> >> [1] https://bugs.openjdk.org/browse/JDK-8159048
> >> [2] https://bugs.openjdk.org/browse/JDK-8313378
>
>

Reply via email to