[11] RFR JDK-8198249: Remove deprecated Runtime::runFinalizersOnExit and System::runFinalizersOnExit
mandy chung
mandy.chung at oracle.com
Wed Feb 21 19:58:20 UTC 2018
Here is the updated webrev:
http://cr.openjdk.java.net/~mchung/jdk11/webrevs/8198249/webrev.04/
I added some comments to clarify the implementation.
Mandy
On 2/21/18 11:34 AM, mandy chung wrote:
> Hi David,
>
> I think I'm clear on the implementation now (my mistake that I
> neglected ApplicationShutdownHooks). Shutdown class keeps the "system
> shutdown hooks". ApplicationShutdownHooks is one system hook that
> starts all application shutdown hooks and waits until they finish.
> java.io.Console and DeleteOnExitHook are two other system shutdown
> hooks to restore console echo state or support deleteOnExit.
>
> The system shutdown hooks are all run in the thread initiating the
> shutdown that holds the Shutdown.class.
>
> On 2/20/18 10:27 PM, David Holmes wrote:
>> Hi Mandy,
>>
>> On 21/02/2018 5:57 AM, mandy chung wrote:
>>> Hi David,
>>>
>>> I reworked the change in Shutdown class and uses
>>> jdk.internal.misc.VM to maintain the shutdown state, either in
>>> progress or shutdown (i.e. all shutdown hooks have been started).
>>>
>>> What do you think this revised version:
>>> http://cr.openjdk.java.net/~mchung/jdk11/webrevs/8198249/webrev.03/
>>
>> It confuses me a bit. On the one hand I wasn't sure why we needed to
>> bring the VM class into this, then on the other hand it perhaps made
>> sense to have VM track shutdown states as well as initialization states.
>>
>
> The latter is my motivation and I think it's a good cleanup to have VM
> state to indicate it's shutdown.
>
>> But I'm not sure about the two-phase "shutdown" state - I think I'd
>> probably prefer a "shutdown initiated" state and a "shutdown
>> complete" state. Then no need to duplicate the constant values for
>> IN_PROGRESS and SHUTDOWN (which now need to be kept in sync with
>> changes to the VM class). It would also simplify the shutdown() logic.
>>
>
> Shutdown::add method can be used to register a system hook while
> shutdown is in progress. Actually currentRunningHook can be used to
> guard if Shutdown::add should reject to add a new hook. I updated the
> webrev and no longer needs the two phases.
>
>> Also shutdown(level) should be using initLevel(value) so that it fits
>> in with the existing awaitInitLevel() logic and locking strategy!
>> Someone may want to wait for shutdown in the future. That also deals
>> with the locking issue in the Shutdown class because you don't need
>> to use "synchronized(lock)" because runHooks is only called within
>> "synchronized(Shutdown.class)". [To be fair the existing locking
>> strategy seems confused to me as well - or at least it confuses me.]
>
> I agree but I tried not to touch the existing locking strategy as it
> should be a separate changeset. I prefer to add VM::shutdown method
>>
>> I also now realize that the changes I suggested for the Runtime.exit
>> docs was incorrect. The existing docs state that we only halt if
>> hooks have already been run - which corresponds to the old and new
>> code. I, for some reason that escapes me, claimed we only cared if
>> the hooks had been started, not completed - but that is inconsistent
>> with old spec and the implementation.
>>
>
> I confused myself too. A small change will fix it:
>
> 87 * <p> If this method is invoked after all shutdown hooks have already
> 88 * been run and the status is nonzero then this method halts the
> 89 * virtual machine with the given status code. Otherwise, this method
>
>
>
> Mandy
>
>> So apologies but what started out as a seemingly simple code removal,
>> has become a lot more complicated, and confusing to me.
>>
>> Thanks,
>> David
>> -----
>>
>>> On 2/15/18 9:14 PM, David Holmes wrote:
>>>>
>>>> All other updates seem okay. I did have one further thought - in
>>>> Runtime does this change:
>>>>
>>>> public void runFinalization() {
>>>> ! SharedSecrets.getJavaLangRefAccess().runFinalization();
>>>> }
>>>>
>>>> affect the classloading/initialization order at all?
>>>
>>> Runtime::runFinalization is not called by the system code. So it
>>> won't be invoked during startup and hence won't change the
>>> classloading order during startup.
>>>
>>> Mandy
>
More information about the core-libs-dev
mailing list