changeset 11735:9c9683970656

Allow multiple NodeChangedListeners.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 20 Sep 2013 13:41:24 +0200
parents 5c43ea890efa
children 63ca7ec7440f 85b846b31690
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java
diffstat 1 files changed, 36 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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;
+        }
     }
 
     /**