src/jdk.jfr/share/classes/jdk/jfr/internal/FilePurger.java
author mgronlun
Fri, 17 May 2019 18:03:14 +0200
branchJEP-349-branch
changeset 57361 53dccc90a5be
child 58120 630261dd77f9
permissions -rw-r--r--
Preview-addendum

package jdk.jfr.internal;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

import jdk.jfr.internal.SecuritySupport.SafePath;

// This class keeps track of files that can't be deleted
// so they can a later staged be removed.
final class FilePurger {

	private final static Set<SafePath> paths = new LinkedHashSet<>();

	public synchronized static void add(SafePath p) {
		paths.add(p);
		if (paths.size() > 1000) {
			removeOldest();
		}
	}

	public synchronized static void purge() {
		if (paths.isEmpty()) {
			return;
		}

		for (SafePath p : new ArrayList<>(paths)) {
			if (delete(p)) {
				paths.remove(p);
			}
		}
	}

    private static void removeOldest() {
        SafePath oldest = paths.iterator().next();
        paths.remove(oldest);
    }

	private static boolean delete(SafePath p) {
		try {
			SecuritySupport.delete(p);
			return true;
		} catch (IOException e) {
			return false;
		}
	}
}