From 5fb1d16b78cecb1c2cf6fdb4b4a1f45f47a4190c Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Fri, 11 Aug 2017 08:47:32 +0200 Subject: [PATCH] Fix: Sharing loaded DLLs in mode SHARE_ALL. --- .../src/com/oracle/truffle/r/runtime/ffi/DLL.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java index 74fde87992..4bf6fc5df3 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java @@ -32,6 +32,7 @@ import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.ReturnException; import com.oracle.truffle.r.runtime.Utils; import com.oracle.truffle.r.runtime.context.RContext; +import com.oracle.truffle.r.runtime.context.RContext.ContextKind; import com.oracle.truffle.r.runtime.context.RContext.ContextState; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RExternalPtr; @@ -84,7 +85,7 @@ public class DLL { @Override public ContextState initialize(RContext contextArg) { this.context = contextArg; - if (context.getKind() == RContext.ContextKind.SHARE_PARENT_RW) { + if (isShareDLLKind(context.getKind())) { list = context.getParent().stateDLL.list; } else { list = new ArrayList<>(); @@ -98,7 +99,7 @@ public class DLL { @Override public void beforeDestroy(RContext contextArg) { - if (context.getKind() != RContext.ContextKind.SHARE_PARENT_RW) { + if (!isShareDLLKind(context.getKind())) { for (int i = 1; i < list.size(); i++) { DLLInfo dllInfo = list.get(i); DLLRFFI.DLCloseRootNode.create().getCallTarget().call(dllInfo.handle); @@ -107,6 +108,10 @@ public class DLL { list = null; } + private static boolean isShareDLLKind(RContext.ContextKind kind) { + return kind == ContextKind.SHARE_PARENT_RW || kind == ContextKind.SHARE_ALL; + } + private void addLibR(DLLInfo dllInfo) { assert list.isEmpty(); list.add(dllInfo); -- GitLab