From db3a771cffc9ae360609fb1b13d68464da0cf1d1 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Thu, 13 Apr 2017 09:43:34 +0200
Subject: [PATCH] synchronize on FSCM

---
 .../oracle/truffle/r/nodes/function/ArgumentStatePush.java   | 5 ++++-
 .../truffle/r/nodes/function/PostProcessArgumentsNode.java   | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentStatePush.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentStatePush.java
index 605d628d4f..4c9b9aa0b6 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentStatePush.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/ArgumentStatePush.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.data.RLanguage;
 import com.oracle.truffle.r.runtime.data.RShareable;
 import com.oracle.truffle.r.runtime.data.RSharingAttributeStorage;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
+import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
 
 /**
  * A {@link ArgumentStatePush} is used to bump up state transition for function arguments.
@@ -98,7 +99,9 @@ public abstract class ArgumentStatePush extends Node {
             if (writeArgMask != -1 && !FastROptions.RefCountIncrementOnly.getBooleanValue()) {
                 if (frameSlot == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
-                    frameSlot = frame.getFrameDescriptor().findOrAddFrameSlot(writeArgMask, FrameSlotKind.Object);
+                    synchronized (FrameSlotChangeMonitor.class) {
+                        frameSlot = frame.getFrameDescriptor().findOrAddFrameSlot(writeArgMask, FrameSlotKind.Object);
+                    }
                 }
                 frame.setObject(frameSlot, shareable);
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PostProcessArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PostProcessArgumentsNode.java
index bb1d668a60..f5f59a4459 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PostProcessArgumentsNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PostProcessArgumentsNode.java
@@ -34,6 +34,7 @@ import com.oracle.truffle.api.utilities.AssumedValue;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RShareable;
+import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
 import com.oracle.truffle.r.runtime.nodes.RNode;
 
 /**
@@ -73,7 +74,9 @@ public final class PostProcessArgumentsNode extends RNode {
                 if ((bits & mask) != 0) {
                     if (frameSlots[i] == null) {
                         CompilerDirectives.transferToInterpreterAndInvalidate();
-                        frameSlots[i] = frame.getFrameDescriptor().findOrAddFrameSlot(mask, FrameSlotKind.Object);
+                        synchronized (FrameSlotChangeMonitor.class) {
+                            frameSlots[i] = frame.getFrameDescriptor().findOrAddFrameSlot(mask, FrameSlotKind.Object);
+                        }
                     }
                     RShareable s;
                     try {
-- 
GitLab