# HG changeset patch # User Roland Schatz # Date 1379677284 -7200 # Node ID 9c968397065690f1fcd5a6a0aad0f22f4fb75859 # Parent 5c43ea890efa8df64d5339e13a486d053bb7018c Allow multiple NodeChangedListeners. diff -r 5c43ea890efa -r 9c9683970656 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Fri Sep 20 11:37:03 2013 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Fri Sep 20 13:41:24 2013 +0200 @@ -250,24 +250,54 @@ void nodeChanged(Node node); } + private static class ChainedNodeChangedListener implements NodeChangedListener { + + NodeChangedListener head; + NodeChangedListener next; + + ChainedNodeChangedListener(NodeChangedListener head, NodeChangedListener next) { + this.head = head; + this.next = next; + } + + public void nodeChanged(Node node) { + head.nodeChanged(node); + next.nodeChanged(node); + } + } + public void trackInputChange(NodeChangedListener inputChangedListener) { - assert this.inputChanged == null; - this.inputChanged = inputChangedListener; + if (inputChanged == null) { + inputChanged = inputChangedListener; + } else { + inputChanged = new ChainedNodeChangedListener(inputChangedListener, inputChanged); + } } public void stopTrackingInputChange() { assert inputChanged != null; - inputChanged = null; + if (inputChanged instanceof ChainedNodeChangedListener) { + inputChanged = ((ChainedNodeChangedListener) inputChanged).next; + } else { + inputChanged = null; + } } public void trackUsagesDroppedZero(NodeChangedListener usagesDroppedZeroListener) { - assert this.usagesDroppedZero == null; - this.usagesDroppedZero = usagesDroppedZeroListener; + if (usagesDroppedZero == null) { + usagesDroppedZero = usagesDroppedZeroListener; + } else { + usagesDroppedZero = new ChainedNodeChangedListener(usagesDroppedZeroListener, usagesDroppedZero); + } } public void stopTrackingUsagesDroppedZero() { assert usagesDroppedZero != null; - usagesDroppedZero = null; + if (usagesDroppedZero instanceof ChainedNodeChangedListener) { + usagesDroppedZero = ((ChainedNodeChangedListener) usagesDroppedZero).next; + } else { + usagesDroppedZero = null; + } } /**