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