From ea9a937a63e19b76ff62b47ab8406653cc2f2968 Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Wed, 19 Aug 2015 16:41:24 -0700
Subject: [PATCH] Fix for a race condition on accessing RContext.lastContext .

---
 .../truffle/r/engine/RContextFactory.java     | 32 ++++++++++++-------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RContextFactory.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RContextFactory.java
index 6d4ac87442..a3c3e05c2d 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RContextFactory.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RContextFactory.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.engine;
 
 import java.io.*;
 import java.util.*;
+import java.util.concurrent.*;
 import java.util.function.*;
 
 import com.oracle.truffle.api.vm.*;
@@ -55,23 +56,32 @@ public class RContextFactory {
         RContext.initialize(new RRuntimeASTAccessImpl(), RBuiltinPackages.getInstance(), FastROptions.IgnoreVisibility);
     }
 
+    private static final Semaphore createSemaphore = new Semaphore(1, true);
+
     /**
      * Create a context of given kind.
      */
     public static TruffleVM create(ContextInfo info, Consumer<TruffleVM.Builder> setup) {
-        RContext.tempInitializingContextInfo = info;
-        Builder builder = TruffleVM.newVM();
-        if (setup != null) {
-            setup.accept(builder);
-        }
-        TruffleVM vm = builder.build();
         try {
-            vm.eval(TruffleRLanguage.MIME, "invisible(1)");
-        } catch (IOException e) {
-            throw RInternalError.shouldNotReachHere(e);
+            createSemaphore.acquire();
+            RContext.tempInitializingContextInfo = info;
+            Builder builder = TruffleVM.newVM();
+            if (setup != null) {
+                setup.accept(builder);
+            }
+            TruffleVM vm = builder.build();
+            try {
+                vm.eval(TruffleRLanguage.MIME, "invisible(1)");
+            } catch (IOException e) {
+                createSemaphore.release();
+                throw RInternalError.shouldNotReachHere(e);
+            }
+            RContext.associate(vm);
+            createSemaphore.release();
+            return vm;
+        } catch (InterruptedException x) {
+            throw RError.error(RError.NO_NODE, RError.Message.GENERIC, "Error creating parallel R runtime instance");
         }
-        RContext.associate(vm);
-        return vm;
     }
 
     /**
-- 
GitLab