changeset 19816:a71b0398f8c7

fix race in expansion of superclass iterableIds
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Thu, 12 Mar 2015 12:15:06 -0700
parents 7ee442766685
children 8b7a143aea6b 2fcc5ea8c110
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java
diffstat 1 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Thu Mar 12 16:45:24 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Thu Mar 12 12:15:06 2015 -0700
@@ -182,9 +182,7 @@
 
                 NodeClass<?> snc = superNodeClass;
                 while (snc != null && IterableNodeType.class.isAssignableFrom(snc.getClazz())) {
-                    assert !containsId(this.iterableId, snc.iterableIds);
-                    snc.iterableIds = Arrays.copyOf(snc.iterableIds, snc.iterableIds.length + 1);
-                    snc.iterableIds[snc.iterableIds.length - 1] = this.iterableId;
+                    snc.addIterableId(iterableId);
                     snc = snc.superNodeClass;
                 }
 
@@ -195,6 +193,23 @@
             this.iterableIds = null;
         }
         nodeIterableCount = Debug.metric("NodeIterable_%s", clazz);
+        assert verifyIterableIds();
+    }
+
+    private synchronized void addIterableId(int newIterableId) {
+        assert !containsId(newIterableId, iterableIds);
+        int[] copy = Arrays.copyOf(iterableIds, iterableIds.length + 1);
+        copy[iterableIds.length] = newIterableId;
+        iterableIds = copy;
+    }
+
+    private boolean verifyIterableIds() {
+        NodeClass<?> snc = superNodeClass;
+        while (snc != null && IterableNodeType.class.isAssignableFrom(snc.getClazz())) {
+            assert containsId(iterableId, snc.iterableIds);
+            snc = snc.superNodeClass;
+        }
+        return true;
     }
 
     private static boolean containsId(int iterableId, int[] iterableIds) {