# HG changeset patch # User Doug Simon # Date 1410175490 -7200 # Node ID cc8bd79d8d573174c467c760d4685a54e1875479 # Parent a5dc5513ce85f8992f84cd29e5aaea628d1ccc6a fixed race involving NodeRefIterator.Empty diff -r a5dc5513ce85 -r cc8bd79d8d57 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeRefIterable.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeRefIterable.java Mon Sep 08 09:46:07 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeRefIterable.java Mon Sep 08 13:24:50 2014 +0200 @@ -30,7 +30,7 @@ * An iterator over the references to a given {@link Node}'s {@linkplain Input inputs} or * {@linkplain Successor successors}. */ -public class NodeRefIterable implements NodeClassIterable { +public final class NodeRefIterable implements NodeClassIterable { protected final Node node; diff -r a5dc5513ce85 -r cc8bd79d8d57 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeRefIterator.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeRefIterator.java Mon Sep 08 09:46:07 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeRefIterator.java Mon Sep 08 13:24:50 2014 +0200 @@ -36,7 +36,7 @@ */ public class NodeRefIterator implements NodePosIterator { - public static final NodeRefIterator Empty = new NodeRefIterator(null, 0, 0, false); + public static final NodeRefIterator Empty = new NodeRefIterator(); protected final Node node; @@ -93,6 +93,18 @@ } /** + * Constructor for {@link #Empty}. + */ + private NodeRefIterator() { + this(null, 0, 0, false); + // This constructor must only be used to construct Empty + assert Empty == null; + // This must be set here to prevent multiple threads racing to + // call forward() which never needs to be done for Empty. + this.needsForward = false; + } + + /** * Gets the value of a {@link Node} field in the node. * * @param at the index of the Node field whose value is being requested. This is guaranteed to