< prev index next >
src/java.base/share/classes/java/io/DeleteOnExitHook.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2019, 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
@@ -33,11 +33,11 @@
* 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<>();
+ private static LinkedHashMap<String, int[]> files = new LinkedHashMap<>();
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
@@ -59,22 +59,28 @@
if(files == null) {
// DeleteOnExitHook is running. Too late to add a file
throw new IllegalStateException("Shutdown in progress");
}
- files.add(file);
+ files.computeIfAbsent(file, f -> new int[1])[0]++;
+ }
+
+ static synchronized void remove(String file) {
+ if(files != null) {
+ files.computeIfPresent(file, (f, count) -> --count[0] <= 0 ? null : count);
+ }
}
static void runHooks() {
- LinkedHashSet<String> theFiles;
+ LinkedHashMap<String, int[]> theFiles;
synchronized (DeleteOnExitHook.class) {
theFiles = files;
files = null;
}
- ArrayList<String> toBeDeleted = new ArrayList<>(theFiles);
+ ArrayList<String> toBeDeleted = new ArrayList<>(theFiles.keySet());
// reverse the list to maintain previous jdk deletion order.
// Last in first deleted.
Collections.reverse(toBeDeleted);
for (String filename : toBeDeleted) {
< prev index next >