Review request for 6829503

Alan Bateman Alan.Bateman at Sun.COM
Sat Apr 18 16:48:57 UTC 2009

Mandy Chung wrote:
> 6829503: addShutdownHook fails if called after shutdown has commenced.
> Webrev at:
> I change the Shutdown#add method to take the 
> registerShutdownInProgress parameter.  If set to true, the specified 
> shutdown hook is allowed to be registered while shutdown is in 
> progress.  The method will throw IllegalStateException if the shutdown 
> process already passes this slot.   DeleteOnExitHook is the last 
> shutdown hook to be invoked and it will not be invoked until all 
> application shutdown hooks finish (see 
> ApplicationShutdownHooks.runHooks()).  So any file added to the delete 
> on exit list by the application shutdown hooks will be handled by the 
> DeleteOnExitHook.
> The test passes with this fix.  I also add a new 
> jtreg test to exercise the Console and DeleteOnExitHook being 
> initialized during application shutdown.
> Alan,
>   I considered your suggestion to make Shutdown#add method to return a 
> boolean instead of checking the state.  I am concerned that if the 
> caller didn't check the return value and handle properly, it would be 
> harder to catch the problem.  So I keep it to check the state and 
> throw IllegalStateException.
> Thanks
> Mandy
Good work! It mostly looks good to me and I've only a few comments:

1. I see that registerShutdownHook now throws IAE if the slot is already 
used but if that happens it would be our bug. It can't happen with the 
current code of course but I wonder if an Error might be better (the 
original changes threw an InternalError).

2. File#deleteOnExit doesn't allow IllegalStateException to be thrown so 
maybe we should change DeleteOnExit#add to be a no-op if its shutdown 
hook is running. If an application is attempting to register files to be 
deleted during shutdown it will always be a timing issue if the file is 
deleted or not.

3. In ApplicationShutdownHooks I wonder if it would be cleaner to 
eliminate the static initializer and move the registration attempt into 
the add method. That would avoid needing to catch IllegalStateException 
ie: add becomes:   if (hooks == null) { Shutdown.add(...); hooks = new 
... }. It amounts to the same as what you have now but avoid exception 

4. The synchronization and checking between Shutdown#add and runHooks 
looks right. A minor comment is that the name "curShutdownHookSlot" is a 
bit inconsistent with the other fields. s/curr/current/ or perhaps a 
different name?

5. I usually prefer to have Runnables be the last parameter, in 
particular for cases like this where anonymous inner classes are used. 
An alternative to introducing the boolean parameter is rename one of the 
register methods, say, registerShutdownHookBeforeShutdown or something 


More information about the core-libs-dev mailing list