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