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