< prev index next >

src/java.base/share/classes/java/io/DeleteOnExitHook.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2005, 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 --- 1,7 ---- /* ! * 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,43 **** * 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 --- 33,43 ---- * A set is used both to prevent double-insertion of the same file as well as offer * quick removal. */ class DeleteOnExitHook { ! 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,80 **** 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) { --- 59,86 ---- if(files == null) { // DeleteOnExitHook is running. Too late to add a file throw new IllegalStateException("Shutdown in progress"); } ! 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() { ! LinkedHashMap<String, int[]> theFiles; synchronized (DeleteOnExitHook.class) { theFiles = files; files = null; } ! 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 >