Hi Mandy,

On 22/02/2018 12:28 PM, mandy chung wrote:
On 2/21/18 6:08 PM, David Holmes wrote:
Hi Mandy,

tl;dr: I think this is now good to go.

On 22/02/2018 5:58 AM, mandy chung wrote:
Here is the updated webrev:
http://cr.openjdk.java.net/~mchung/jdk11/webrevs/8198249/webrev.04/

I added some comments to clarify the implementation.

src/java.base/share/classes/java/lang/Shutdown.java

 96                 if (VM.isShutdown()|| slot <= currentRunningHook)

Nit: need space after ()



Fixed.

 113 private static void runHooks() {
 114         synchronized (lock) {
 115             /* Guard against the possibility of a daemon thread invoking exit
 116              * after DestroyJavaVM initiates the shutdown sequence
 117              */
 118             if (VM.isShutdown()) return;
 119         }

I think this is actually impossible to hit, but that's a separate cleanup.

When T1 is calling runHooks, T2 calls exit and blocks on Shutdown.class, once T1 releases the lock if VM does not halt yet, T2 will enter this method.

Ah! T1 is executing destroyJavaVM - and of course releases the lock eventually. Got it.


 139         // set shutdown state
 140         VM.shutdown();

Just an observation that we consider "shutdown" to be after all system shutdown hooks are run. So this (contrary to what I wrote in the CSR) narrows the window in which a concurrent exit(-1) would trigger an immediate halt rather than a hang. Which in turn strengthens the argument for just dropping that behaviour.

If an application hook calls exit(0), it will hang (not the thread holding the Shutdown class lock).  Do you want to file an issue to track that?

If an application hook calls exit(0) it will block on the Shutdown.class lock which then hangs the whole shutdown process as the thread holding that lock is doing a join() on the hook thread - logical deadlock.

But that wasn't my point at all. I just think this whole "calling exit with non-zero causes immediate halt" logic is meaningless now there are no finalizers running (and potentially calling exit).

Cheers,
David
-------


---

src/java.base/share/classes/jdk/internal/misc/VM.java

 103     public static void shutdown() {
 104         initLevel(SYSTEM_SHUTDOWN);
 105     }

Doing this is exactly what I meant by my previous comments.


Good.

Thanks for the thorough review.
Mandy

Reply via email to