You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.0 KiB
84 lines
2.0 KiB
/*
|
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
package java.io;
|
|
|
|
import java.util.*;
|
|
import java.io.File;
|
|
|
|
/**
|
|
* This class holds a set of filenames to be deleted on VM exit through a shutdown hook.
|
|
* A set is used both to prevent double-insertion of the same file as well as offer
|
|
* quick removal.
|
|
*/
|
|
|
|
class DeleteOnExitHook {
|
|
private static LinkedHashSet<String> files = new LinkedHashSet<>();
|
|
static {
|
|
// DeleteOnExitHook must be the last shutdown hook to be invoked.
|
|
// Application shutdown hooks may add the first file to the
|
|
// delete on exit list and cause the DeleteOnExitHook to be
|
|
// registered during shutdown in progress. So set the
|
|
// registerShutdownInProgress parameter to true.
|
|
sun.misc.SharedSecrets.getJavaLangAccess()
|
|
.registerShutdownHook(2 /* Shutdown hook invocation order */,
|
|
true /* register even if shutdown in progress */,
|
|
new Runnable() {
|
|
public void run() {
|
|
runHooks();
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
private DeleteOnExitHook() {}
|
|
|
|
static synchronized void add(String file) {
|
|
if(files == null) {
|
|
// DeleteOnExitHook is running. Too late to add a file
|
|
throw new IllegalStateException("Shutdown in progress");
|
|
}
|
|
|
|
files.add(file);
|
|
}
|
|
|
|
static void runHooks() {
|
|
LinkedHashSet<String> theFiles;
|
|
|
|
synchronized (DeleteOnExitHook.class) {
|
|
theFiles = files;
|
|
files = null;
|
|
}
|
|
|
|
ArrayList<String> toBeDeleted = new ArrayList<>(theFiles);
|
|
|
|
// reverse the list to maintain previous jdk deletion order.
|
|
// Last in first deleted.
|
|
Collections.reverse(toBeDeleted);
|
|
for (String filename : toBeDeleted) {
|
|
(new File(filename)).delete();
|
|
}
|
|
}
|
|
}
|