Skip to content
Snippets Groups Projects
Commit 944093c8 authored by Florian Angerer's avatar Florian Angerer
Browse files

Removed synchronization for native calls.

parent 4498d654
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
}
......
......@@ -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);
}
}
}
......
......@@ -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) {
......
......@@ -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);
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment