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 17325b33650a5e6e338a27d9e0fc71eda1a57871..8b8e778a0eb4ae4ca2fdf599791cf15688f5d483 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 ee3d5222ab9ef5942554bf0221b1231271614bd5..70ad5c69a4f2269113074d15c04c06c57c013e18 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 e869188edb5536668845518bb77468b88a57c634..c6a44575fbe04e3278328db0b434fb5601f18f72 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 4c1547d092df23ed89a23f5a5ca64df3d0070e19..2e474e0ac64cc2758b89e88eb6158a6553e539e5 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);
             }
         }
     }