< prev index next >
src/java.base/share/classes/java/lang/Shutdown.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -37,16 +37,13 @@
class Shutdown {
/* Shutdown state */
private static final int RUNNING = 0;
private static final int HOOKS = 1;
- private static final int FINALIZERS = 2;
+ private static final int COMPLETED = 2;
private static int state = RUNNING;
- /* Should we run all finalizers upon exit? */
- private static boolean runFinalizersOnExit = false;
-
// The system shutdown hooks are registered with a predefined slot.
// The list of shutdown hooks is as follows:
// (0) Console restore hook
// (1) Application hooks
// (2) DeleteOnExit hook
@@ -61,18 +58,10 @@
private static Object lock = new Lock();
/* Lock object for the native halt method */
private static Object haltLock = new Lock();
- /* Invoked by Runtime.runFinalizersOnExit */
- static void setRunFinalizersOnExit(boolean run) {
- synchronized (lock) {
- runFinalizersOnExit = run;
- }
- }
-
-
/**
* Add a new shutdown hook. Checks the shutdown state and the hook itself,
* but does not do any security checks.
*
* The registerShutdownInProgress parameter should be false except
@@ -109,10 +98,17 @@
}
/* Run all registered shutdown hooks
*/
private static void runHooks() {
+ synchronized (lock) {
+ /* Guard against the possibility of a daemon thread invoking exit
+ * after DestroyJavaVM initiates the shutdown sequence
+ */
+ if (state != HOOKS) return;
+ }
+
for (int i=0; i < MAX_SYSTEM_HOOKS; i++) {
try {
Runnable hook;
synchronized (lock) {
// acquire the lock to make sure the hook registered during
@@ -126,10 +122,14 @@
ThreadDeath td = (ThreadDeath)t;
throw td;
}
}
}
+
+ synchronized (lock) {
+ state = COMPLETED;
+ }
}
/* The halt method is synchronized on the halt lock
* to avoid corruption of the delete-on-shutdown file list.
* It invokes the true native halt method.
@@ -140,78 +140,35 @@
}
}
static native void halt0(int status);
- /* Wormhole for invoking java.lang.ref.Finalizer.runAllFinalizers */
- private static native void runAllFinalizers();
-
-
- /* The actual shutdown sequence is defined here.
- *
- * If it weren't for runFinalizersOnExit, this would be simple -- we'd just
- * run the hooks and then halt. Instead we need to keep track of whether
- * we're running hooks or finalizers. In the latter case a finalizer could
- * invoke exit(1) to cause immediate termination, while in the former case
- * any further invocations of exit(n), for any n, simply stall. Note that
- * if on-exit finalizers are enabled they're run iff the shutdown is
- * initiated by an exit(0); they're never run on exit(n) for n != 0 or in
- * response to SIGINT, SIGTERM, etc.
- */
- private static void sequence() {
- synchronized (lock) {
- /* Guard against the possibility of a daemon thread invoking exit
- * after DestroyJavaVM initiates the shutdown sequence
- */
- if (state != HOOKS) return;
- }
- runHooks();
- boolean rfoe;
- synchronized (lock) {
- state = FINALIZERS;
- rfoe = runFinalizersOnExit;
- }
- if (rfoe) runAllFinalizers();
- }
-
-
/* Invoked by Runtime.exit, which does all the security checks.
* Also invoked by handlers for system-provided termination events,
* which should pass a nonzero status code.
*/
static void exit(int status) {
- boolean runMoreFinalizers = false;
synchronized (lock) {
- if (status != 0) runFinalizersOnExit = false;
switch (state) {
case RUNNING: /* Initiate shutdown */
state = HOOKS;
break;
case HOOKS: /* Stall and halt */
break;
- case FINALIZERS:
+ case COMPLETED:
if (status != 0) {
/* Halt immediately on nonzero status */
halt(status);
- } else {
- /* Compatibility with old behavior:
- * Run more finalizers and then halt
- */
- runMoreFinalizers = runFinalizersOnExit;
}
break;
}
}
- if (runMoreFinalizers) {
- runAllFinalizers();
- halt(status);
- }
synchronized (Shutdown.class) {
/* Synchronize on the class object, causing any other thread
* that attempts to initiate shutdown to stall indefinitely
*/
- sequence();
+ runHooks();
halt(status);
}
}
@@ -224,15 +181,16 @@
switch (state) {
case RUNNING: /* Initiate shutdown */
state = HOOKS;
break;
case HOOKS: /* Stall and then return */
- case FINALIZERS:
break;
+ case COMPLETED:
+ return;
}
}
synchronized (Shutdown.class) {
- sequence();
+ runHooks();
}
}
}
< prev index next >