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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57361
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     1
package jdk.jfr.internal;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     2
import java.io.IOException;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     3
import java.util.ArrayList;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     4
import java.util.LinkedHashSet;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     5
import java.util.Set;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     6
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     7
import jdk.jfr.internal.SecuritySupport.SafePath;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     8
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
     9
// This class keeps track of files that can't be deleted
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    10
// so they can a later staged be removed.
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    11
final class FilePurger {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    12
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    13
	private final static Set<SafePath> paths = new LinkedHashSet<>();
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    14
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    15
	public synchronized static void add(SafePath p) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    16
		paths.add(p);
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    17
		if (paths.size() > 1000) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    18
			removeOldest();
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    19
		}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    20
	}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    21
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    22
	public synchronized static void purge() {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    23
		if (paths.isEmpty()) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    24
			return;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    25
		}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    26
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    27
		for (SafePath p : new ArrayList<>(paths)) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    28
			if (delete(p)) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    29
				paths.remove(p);
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    30
			}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    31
		}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    32
	}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    33
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    34
    private static void removeOldest() {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    35
        SafePath oldest = paths.iterator().next();
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    36
        paths.remove(oldest);
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    37
    }
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    38
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    39
	private static boolean delete(SafePath p) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    40
		try {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    41
			SecuritySupport.delete(p);
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    42
			return true;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    43
		} catch (IOException e) {
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    44
			return false;
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    45
		}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    46
	}
53dccc90a5be Preview-addendum
mgronlun
parents:
diff changeset
    47
}