# HG changeset patch # User Christian Humer # Date 1412008745 -7200 # Node ID 1680a4ddc2a7769a9ec18ca223ce0f7f2b0f111b # Parent 6ee7afea175afd1ff01005fbd5a65a9b93fc1a7c Truffle-DSL: added thread-safety for DSL rewrites. diff -r 6ee7afea175a -r 1680a4ddc2a7 graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java --- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java Mon Sep 29 18:37:24 2014 +0200 +++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/DSLShare.java Mon Sep 29 18:39:05 2014 +0200 @@ -25,6 +25,7 @@ package com.oracle.truffle.api.dsl.internal; import java.util.*; +import java.util.concurrent.*; import com.oracle.truffle.api.nodes.*; @@ -50,19 +51,23 @@ return containsClass(newNode.getMetadata0().getIncludes(), oldNode); } - public static T rewrite(Node thisNode, T newNode, String message) { - assert newNode != null; - if (getNext(thisNode) != null || getPrevious(thisNode) != null) { - // already polymorphic -> append - return appendPolymorphic(findUninitialized(thisNode), newNode); - } else if (includes(thisNode, newNode)) { - // included -> remains monomorphic - newNode.adoptChildren0(thisNode, null); - return thisNode.replace(newNode, message); - } else { - // goto polymorphic - return null; - } + public static T rewrite(final Node thisNode, final T newNode, final String message) { + return thisNode.atomic(new Callable() { + public T call() { + assert newNode != null; + if (getNext(thisNode) != null || getPrevious(thisNode) != null) { + // already polymorphic -> append + return appendPolymorphic(findUninitialized(thisNode), newNode); + } else if (includes(thisNode, newNode)) { + // included -> remains monomorphic + newNode.adoptChildren0(thisNode, null); + return thisNode.replace(newNode, message); + } else { + // goto polymorphic + return null; + } + } + }); } @SuppressWarnings("unchecked") @@ -86,37 +91,47 @@ return cur; } - public static T rewriteUninitialized(Node uninitialized, T newNode) { - Node prev = getPrevious(uninitialized); - if (prev == null) { - newNode.adoptChildren0(uninitialized, null); - return uninitialized.replace(newNode, "Uninitialized monomorphic"); - } else { - return appendPolymorphic(uninitialized, newNode); - } + public static T rewriteUninitialized(final Node uninitialized, final T newNode) { + return uninitialized.atomic(new Callable() { + public T call() { + Node prev = getPrevious(uninitialized); + if (prev == null) { + newNode.adoptChildren0(uninitialized, null); + return uninitialized.replace(newNode, "Uninitialized monomorphic"); + } else { + return appendPolymorphic(uninitialized, newNode); + } + } + }); + } - public static T rewriteToPolymorphic(Node oldNode, DSLNode uninitializedDSL, T polymorphic, DSLNode currentCopy, DSLNode newNodeDSL, String message) { - assert getNext(oldNode) == null; - assert getPrevious(oldNode) == null; - assert newNodeDSL != null; + public static T rewriteToPolymorphic(final Node oldNode, final DSLNode uninitializedDSL, final T polymorphic, final DSLNode currentCopy, final DSLNode newNodeDSL, + final String message) { + return oldNode.atomic(new Callable() { + public T call() { + assert getNext(oldNode) == null; + assert getPrevious(oldNode) == null; + assert newNodeDSL != null; - Node uninitialized = (Node) uninitializedDSL; - Node newNode = (Node) newNodeDSL; - polymorphic.adoptChildren0(oldNode, (Node) currentCopy); + Node uninitialized = (Node) uninitializedDSL; + Node newNode = (Node) newNodeDSL; + polymorphic.adoptChildren0(oldNode, (Node) currentCopy); - updateSourceSection(oldNode, uninitialized); - // new specialization - updateSourceSection(oldNode, newNode); - newNodeDSL.adoptChildren0(null, uninitialized); - currentCopy.adoptChildren0(null, newNode); + updateSourceSection(oldNode, uninitialized); + // new specialization + updateSourceSection(oldNode, newNode); + newNodeDSL.adoptChildren0(null, uninitialized); + currentCopy.adoptChildren0(null, newNode); - oldNode.replace(polymorphic, message); + oldNode.replace(polymorphic, message); - assert polymorphic.getNext0() == currentCopy; - assert newNode != null ? currentCopy.getNext0() == newNode : currentCopy.getNext0() == uninitialized; - assert uninitializedDSL.getNext0() == null; - return polymorphic; + assert polymorphic.getNext0() == currentCopy; + assert newNode != null ? currentCopy.getNext0() == newNode : currentCopy.getNext0() == uninitialized; + assert uninitializedDSL.getNext0() == null; + return polymorphic; + } + }); } private static void updateSourceSection(Node oldNode, Node newNode) {