# HG changeset patch # User martin # Date 1522105394 25200 # Mon Mar 26 16:03:14 2018 -0700 # Node ID 5291c97b4d0002c161d039d7715119b6e0419e72 # Parent 9e84094f43256d848d43ee8429eec4c999368f05 8200134: Improve ModuleHashesBuilder.dfs() Reviewed-by: alanb diff --git a/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java b/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java --- a/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java +++ b/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java @@ -35,7 +35,6 @@ import java.util.Deque; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.Map; import java.util.Set; import java.util.function.Consumer; @@ -78,10 +77,8 @@ Graph.Builder builder = new Graph.Builder<>(); Deque deque = new ArrayDeque<>(configuration.modules()); Set visited = new HashSet<>(); - while (!deque.isEmpty()) { - ResolvedModule rm = deque.pop(); - if (!visited.contains(rm)) { - visited.add(rm); + for (ResolvedModule rm; (rm = deque.poll()) != null; ) { + if (visited.add(rm)) { builder.addNode(rm.name()); for (ResolvedModule dm : rm.reads()) { if (!visited.contains(dm)) { @@ -212,17 +209,13 @@ * Returns all nodes reachable from the given set of roots. */ public Set dfs(Set roots) { - Deque deque = new LinkedList<>(roots); - Set visited = new HashSet<>(); - while (!deque.isEmpty()) { - T u = deque.pop(); - if (!visited.contains(u)) { - visited.add(u); - if (contains(u)) { - adjacentNodes(u).stream() - .filter(v -> !visited.contains(v)) - .forEach(deque::push); - } + ArrayDeque deque = new ArrayDeque<>(roots); + HashSet visited = new HashSet<>(); + for (T u; (u = deque.poll()) != null; ) { + if (visited.add(u) && contains(u)) { + adjacentNodes(u).stream() + .filter(v -> !visited.contains(v)) + .forEach(deque::push); } } return visited; @@ -240,11 +233,9 @@ final Map> edges = new HashMap<>(); public void addNode(T node) { - if (nodes.contains(node)) { - return; + if (nodes.add(node)) { + edges.computeIfAbsent(node, _e -> new HashSet<>()); } - nodes.add(node); - edges.computeIfAbsent(node, _e -> new HashSet<>()); } public void addEdge(T u, T v) { @@ -263,13 +254,13 @@ * Topological sort */ private static class TopoSorter { - final Deque result = new LinkedList<>(); + final Deque result = new ArrayDeque<>(); final Deque nodes; final Graph graph; TopoSorter(Graph graph) { this.graph = graph; - this.nodes = new LinkedList<>(graph.nodes); + this.nodes = new ArrayDeque<>(graph.nodes); sort(); } @@ -282,8 +273,8 @@ } private void sort() { - Deque visited = new LinkedList<>(); - Deque done = new LinkedList<>(); + Deque visited = new ArrayDeque<>(); + Deque done = new ArrayDeque<>(); T node; while ((node = nodes.poll()) != null) { if (!visited.contains(node)) {