RFR: 8081474: SwingWorker calls 'done' before the 'doInBackground' is finished [v15]

Prasanta Sadhukhan psadhukhan at openjdk.org
Fri Feb 10 11:52:50 UTC 2023


On Fri, 10 Feb 2023 11:46:22 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

>> SwingWorker done() method [spec ](https://github.com/openjdk/jdk/blob/master/src/java.desktop/share/classes/javax/swing/SwingWorker.java#L452) says "Executed on the Event Dispatch Thread after the doInBackground method is finished"
>> but there's no mechanism in place to honor that claim.
>> The [spec](https://github.com/openjdk/jdk/blob/master/src/java.desktop/share/classes/javax/swing/SwingWorker.java#L289)
>> also says the state should be DONE after doInBackground() returns which is also not done.
>> 
>> Modified the code to honour the specification.
>
> Prasanta Sadhukhan has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - Fix and test updated
>  - Fix and test updated

> I admit I got confused … by now.
> 
> It's been a long discussion.
> 
> > My take is current code fix and spec clarification is done to make code/spec wording consistent with **existing** spec whereas this change is to **enhance** the code/spec which I think we should keep it separate from this fix, as this will cause JCK test to be excluded and will cause JCK to update the test and I am not sure how that will pan out, so I suggest to keep the change to minimal to the extent only which is needed for this fix..
> 
> Yet the spec change is unnecessary if you change the order of calls as [discussed above](https://github.com/openjdk/jdk/pull/11940#discussion_r1095103200).
> 
> Referring to [the same thread](https://github.com/openjdk/jdk/pull/11940#discussion_r1095741184),
> 
> > > > It seems the order of sequence is listener->State.STARTED->doInBackground->listener->DONE->done
> > > 
> > > 
> > > Yes, but the different order is specified: listener(STARTED) -> doInBackground -> done -> listener(DONE).
> > 
> > 
> > But then it will violate
> > https://github.com/openjdk/jdk/blob/810c8a271b4524ae776e2306ef699e04a7d145a2/src/java.desktop/share/classes/javax/swing/SwingWorker.java#L288-L293
> 
> No, it doesn't violate: the state transitions to `DONE` _after method is finished_.
> 
> And I realised [I had addressed it already](https://github.com/openjdk/jdk/pull/11940#discussion_r1095781185).
> 
> [Sergey is right](https://github.com/openjdk/jdk/pull/11940#discussion_r1099522374) there is _no contradiction_. It is how it is specified.
> 
> “The spec for `DONE` state does not specify when the transition occurs.” It says _after_, which is satisfied in either case: 1) `done` method is called, state transitions to `DONE`; or 2) state transitions to `DONE`, then `done` method is called.
> 
> The first case is how it was implemented before this fix. The second case is how it is implemented at this very moment in the this fix.
> 
> If you change the order of these two calls
> 
> https://github.com/openjdk/jdk/blob/76b02ea3a8add954705d6df7f91f5896d141b02d/src/java.desktop/share/classes/javax/swing/SwingWorker.java#L307-L308
> 
> you'll bring back the code to case 1 which aligns with the current specification.
> 
> If you do it, Sergey's concern [in this comment](https://github.com/openjdk/jdk/pull/11940#discussion_r1099522374) _will be resolved_. (For convenience: “Above we discussed that it is possible to see a difference if the listener will do some work on EDT, after the fix the listener will not be called last, is that safe to assume it does not break something?”)
> 
> Even though I don't see it as a problem, it is safer to preserve the specified order. Do you agree?

Yes, I see..I have updated the fix and test.

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

PR: https://git.openjdk.org/jdk/pull/11940



More information about the client-libs-dev mailing list