From 944093c8e26350648a59d6060e411db1c188158b Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Thu, 17 Aug 2017 09:01:41 +0200
Subject: [PATCH] Removed synchronization for native calls.

---
 .../oracle/truffle/r/ffi/impl/jni/JNI_C.java  |   8 +-
 .../truffle/r/ffi/impl/jni/JNI_Call.java      |  90 +++---
 .../truffle/r/ffi/impl/nfi/TruffleNFI_C.java  |  82 +++---
 .../r/ffi/impl/nfi/TruffleNFI_Call.java       | 266 ++++++++----------
 4 files changed, 205 insertions(+), 241 deletions(-)

diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_C.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_C.java
index 17325b3365..8b8e778a0e 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_C.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_C.java
@@ -41,12 +41,10 @@ public class JNI_C implements CRFFI {
         @Override
         @TruffleBoundary
         public void execute(NativeCallInfo nativeCallInfo, Object[] args, boolean hasStrings) {
-            synchronized (JNI_C.class) {
-                if (traceEnabled()) {
-                    traceDownCall(nativeCallInfo.name, args);
-                }
-                c(nativeCallInfo.address.asAddress(), args, hasStrings);
+            if (traceEnabled()) {
+                traceDownCall(nativeCallInfo.name, args);
             }
+            c(nativeCallInfo.address.asAddress(), args, hasStrings);
         }
     }
 
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_Call.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_Call.java
index ee3d5222ab..70ad5c69a4 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_Call.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/jni/JNI_Call.java
@@ -52,53 +52,51 @@ public class JNI_Call implements CallRFFI {
         @Override
         @TruffleBoundary
         public Object execute(NativeCallInfo nativeCallInfo, Object[] args) {
-            synchronized (JNI_Call.class) {
-                long address = nativeCallInfo.address.asAddress();
-                Object result = null;
-                if (traceEnabled()) {
-                    traceDownCall(nativeCallInfo.name, args);
+            long address = nativeCallInfo.address.asAddress();
+            Object result = null;
+            if (traceEnabled()) {
+                traceDownCall(nativeCallInfo.name, args);
+            }
+            try {
+                switch (args.length) {
+                    case 0:
+                        result = call0(address);
+                        break;
+                    case 1:
+                        result = call1(address, args[0]);
+                        break;
+                    case 2:
+                        result = call2(address, args[0], args[1]);
+                        break;
+                    case 3:
+                        result = call3(address, args[0], args[1], args[2]);
+                        break;
+                    case 4:
+                        result = call4(address, args[0], args[1], args[2], args[3]);
+                        break;
+                    case 5:
+                        result = call5(address, args[0], args[1], args[2], args[3], args[4]);
+                        break;
+                    case 6:
+                        result = call6(address, args[0], args[1], args[2], args[3], args[4], args[5]);
+                        break;
+                    case 7:
+                        result = call7(address, args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+                        break;
+                    case 8:
+                        result = call8(address, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
+                        break;
+                    case 9:
+                        result = call9(address, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
+                        break;
+                    default:
+                        result = call(address, args);
+                        break;
                 }
-                try {
-                    switch (args.length) {
-                        case 0:
-                            result = call0(address);
-                            break;
-                        case 1:
-                            result = call1(address, args[0]);
-                            break;
-                        case 2:
-                            result = call2(address, args[0], args[1]);
-                            break;
-                        case 3:
-                            result = call3(address, args[0], args[1], args[2]);
-                            break;
-                        case 4:
-                            result = call4(address, args[0], args[1], args[2], args[3]);
-                            break;
-                        case 5:
-                            result = call5(address, args[0], args[1], args[2], args[3], args[4]);
-                            break;
-                        case 6:
-                            result = call6(address, args[0], args[1], args[2], args[3], args[4], args[5]);
-                            break;
-                        case 7:
-                            result = call7(address, args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
-                            break;
-                        case 8:
-                            result = call8(address, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
-                            break;
-                        case 9:
-                            result = call9(address, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
-                            break;
-                        default:
-                            result = call(address, args);
-                            break;
-                    }
-                    return result;
-                } finally {
-                    if (traceEnabled()) {
-                        traceDownCallReturn(nativeCallInfo.name, result);
-                    }
+                return result;
+            } finally {
+                if (traceEnabled()) {
+                    traceDownCallReturn(nativeCallInfo.name, result);
                 }
             }
         }
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java
index e869188edb..c6a44575fb 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java
@@ -44,82 +44,70 @@ public class TruffleNFI_C implements CRFFI {
         @Specialization(guards = "args.length == 0")
         protected void invokeCall0(NativeCallInfo nativeCallInfo, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") boolean hasStrings,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(): void");
-                    ForeignAccess.sendExecute(executeNode, callFunction);
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                }
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(): void");
+                ForeignAccess.sendExecute(executeNode, callFunction);
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
             }
         }
 
         @Specialization(guards = "args.length == 1")
         protected void invokeCall1(NativeCallInfo nativeCallInfo, Object[] args, @SuppressWarnings("unused") boolean hasStrings,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                try {
-                    Object[] nargs = new Object[args.length];
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
-                    ForeignAccess.sendExecute(executeNode, callFunction, nargs[0]);
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                }
+            try {
+                Object[] nargs = new Object[args.length];
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
+                ForeignAccess.sendExecute(executeNode, callFunction, nargs[0]);
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
             }
         }
 
         @Specialization(guards = "args.length == 2")
         protected void invokeCall2(NativeCallInfo nativeCallInfo, Object[] args, @SuppressWarnings("unused") boolean hasStrings,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                try {
-                    Object[] nargs = new Object[args.length];
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
-                    ForeignAccess.sendExecute(executeNode, callFunction, nargs[0], nargs[1]);
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                }
+            try {
+                Object[] nargs = new Object[args.length];
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
+                ForeignAccess.sendExecute(executeNode, callFunction, nargs[0], nargs[1]);
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
             }
         }
 
         @Specialization(guards = "args.length == 3")
         protected void invokeCall3(NativeCallInfo nativeCallInfo, Object[] args, @SuppressWarnings("unused") boolean hasStrings,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                try {
-                    Object[] nargs = new Object[args.length];
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
-                    ForeignAccess.sendExecute(executeNode, callFunction, nargs[0], nargs[1], nargs[2]);
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                }
+            try {
+                Object[] nargs = new Object[args.length];
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
+                ForeignAccess.sendExecute(executeNode, callFunction, nargs[0], nargs[1], nargs[2]);
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
             }
         }
 
         @Specialization(guards = "args.length == 4")
         protected void invokeCall4(NativeCallInfo nativeCallInfo, Object[] args, @SuppressWarnings("unused") boolean hasStrings,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                try {
-                    Object[] nargs = new Object[args.length];
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
-                    ForeignAccess.sendExecute(executeNode, callFunction, nargs[0], nargs[1], nargs[2], nargs[3]);
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                }
+            try {
+                Object[] nargs = new Object[args.length];
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", getSignature(args, nargs));
+                ForeignAccess.sendExecute(executeNode, callFunction, nargs[0], nargs[1], nargs[2], nargs[3]);
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
             }
         }
 
         @Fallback
         protected void invokeCallN(@SuppressWarnings("unused") NativeCallInfo nativeCallInfo, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") boolean hasStrings) {
-            synchronized (TruffleNFI_Call.class) {
-                throw RInternalError.unimplemented(".C (too many args)");
-            }
+            throw RInternalError.unimplemented(".C (too many args)");
         }
 
         public static Node createExecute(int n) {
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java
index 4c1547d092..2e474e0ac6 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java
@@ -236,178 +236,160 @@ public class TruffleNFI_Call implements CallRFFI {
         @Specialization(guards = "args.length == 0")
         protected Object invokeCall0(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 1")
         protected Object invokeCall1(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 2")
         protected Object invokeCall2(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 3")
         protected Object invokeCall3(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1], args[2]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1], args[2]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 4")
         protected Object invokeCall4(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1], args[2],
-                                    args[3]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1], args[2],
+                                args[3]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 5")
         protected Object invokeCall5(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
-                                    args[2], args[3], args[4]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
+                                args[2], args[3], args[4]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 6")
         protected Object invokeCall6(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
-                                    args[2], args[3], args[4], args[5]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
+                                args[2], args[3], args[4], args[5]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 7")
         protected Object invokeCall7(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object, object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
-                                    args[2], args[3], args[4], args[5],
-                                    args[6]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object, object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
+                                args[2], args[3], args[4], args[5],
+                                args[6]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
         @Specialization(guards = "args.length == 8")
         protected Object invokeCall8(NativeCallInfo nativeCallInfo, Object[] args,
                         @Cached("createExecute(args.length)") Node executeNode) {
-            synchronized (TruffleNFI_Call.class) {
-                Object result = null;
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                    nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object, object, object, object): object");
-                    result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
-                                    args[2], args[3], args[4], args[5],
-                                    args[6], args[7]);
-                    return result;
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, result, isNullSetting);
-                }
+            Object result = null;
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                TruffleObject callFunction = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                nativeCallInfo.address.asTruffleObject(), "bind", "(object, object, object, object, object, object, object, object): object");
+                result = ForeignAccess.sendExecute(executeNode, callFunction, args[0], args[1],
+                                args[2], args[3], args[4], args[5],
+                                args[6], args[7]);
+                return result;
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, result, isNullSetting);
             }
         }
 
@@ -425,26 +407,24 @@ public class TruffleNFI_Call implements CallRFFI {
 
         @Override
         public void execute(NativeCallInfo nativeCallInfo, Object[] args) {
-            synchronized (TruffleNFI_Call.class) {
-                boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
-                try {
-                    switch (args.length) {
-                        case 0:
-                            TruffleObject callVoid0Function = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                            nativeCallInfo.address.asTruffleObject(), "bind", CallVoid0Sig);
-                            ForeignAccess.sendExecute(execute0Node, callVoid0Function);
-                            break;
-                        case 1:
-                            TruffleObject callVoid1Function = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
-                                            nativeCallInfo.address.asTruffleObject(), "bind", CallVoid1Sig);
-                            ForeignAccess.sendExecute(execute1Node, callVoid1Function, args[0]);
-                            break;
-                    }
-                } catch (InteropException ex) {
-                    throw RInternalError.shouldNotReachHere(ex);
-                } finally {
-                    prepareReturn(nativeCallInfo.name, null, isNullSetting);
+            boolean isNullSetting = prepareCall(nativeCallInfo.name, args);
+            try {
+                switch (args.length) {
+                    case 0:
+                        TruffleObject callVoid0Function = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                        nativeCallInfo.address.asTruffleObject(), "bind", CallVoid0Sig);
+                        ForeignAccess.sendExecute(execute0Node, callVoid0Function);
+                        break;
+                    case 1:
+                        TruffleObject callVoid1Function = (TruffleObject) ForeignAccess.sendInvoke(bindNode,
+                                        nativeCallInfo.address.asTruffleObject(), "bind", CallVoid1Sig);
+                        ForeignAccess.sendExecute(execute1Node, callVoid1Function, args[0]);
+                        break;
                 }
+            } catch (InteropException ex) {
+                throw RInternalError.shouldNotReachHere(ex);
+            } finally {
+                prepareReturn(nativeCallInfo.name, null, isNullSetting);
             }
         }
     }
-- 
GitLab