Mandy Chung wrote:
6829503: addShutdownHook fails if called after shutdown has commenced.

Webrev at:
  http://cr.openjdk.java.net/~mchung/6829503/webrev.00/

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 LoggingDeadlock2.java 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 catching.

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 better.

-Alan.




Reply via email to