use of org.ballerinalang.bre.bvm.WorkerExecutionContext in project ballerina by ballerina-lang.
the class BLangFunctions method invokeNativeCallable.
private static WorkerExecutionContext invokeNativeCallable(CallableUnitInfo callableUnitInfo, WorkerExecutionContext parentCtx, int[] argRegs, int[] retRegs, int flags) {
WorkerData parentLocalData = parentCtx.workerLocal;
BType[] retTypes = callableUnitInfo.getRetParamTypes();
WorkerData caleeSF = BLangVMUtils.createWorkerDataForLocal(callableUnitInfo.getDefaultWorkerInfo(), parentCtx, argRegs, callableUnitInfo.getParamTypes());
Context ctx = new NativeCallContext(parentCtx, callableUnitInfo, caleeSF);
NativeCallableUnit nativeCallable = callableUnitInfo.getNativeCallableUnit();
if (nativeCallable == null) {
return parentCtx;
}
try {
if (nativeCallable.isBlocking()) {
nativeCallable.execute(ctx, null);
BLangVMUtils.populateWorkerDataWithValues(parentLocalData, retRegs, ctx.getReturnValues(), retTypes);
if (TraceManagerWrapper.getInstance().isTraceEnabled() && FunctionFlags.isObserved(flags)) {
TraceUtil.finishTraceSpan(TraceUtil.getTracer(parentCtx));
}
/* we want the parent to continue, since we got the response of the native call already */
return parentCtx;
} else {
CallableUnitCallback callback;
if (TraceManagerWrapper.getInstance().isTraceEnabled() && FunctionFlags.isObserved(flags)) {
callback = new TraceableCallbackWrapper(parentCtx, new BLangCallableUnitCallback(ctx, parentCtx, retRegs, retTypes));
} else {
callback = new BLangCallableUnitCallback(ctx, parentCtx, retRegs, retTypes);
}
nativeCallable.execute(ctx, callback);
/* we want the parent to suspend (i.e. go to wait for response state) and stay until notified */
return null;
}
} catch (BLangNullReferenceException e) {
return BLangVMUtils.handleNativeInvocationError(parentCtx, BLangVMErrors.createNullRefException(callableUnitInfo));
} catch (Throwable e) {
return BLangVMUtils.handleNativeInvocationError(parentCtx, BLangVMErrors.createError(callableUnitInfo, e.getMessage()));
}
}
use of org.ballerinalang.bre.bvm.WorkerExecutionContext in project ballerina by ballerina-lang.
the class BLangFunctions method invokeServiceInitFunction.
public static void invokeServiceInitFunction(FunctionInfo initFuncInfo) {
WorkerExecutionContext context = new WorkerExecutionContext(initFuncInfo.getPackageInfo().getProgramFile());
invokeCallable(initFuncInfo, context, new int[0], new int[0], true);
if (context.getError() != null) {
String stackTraceStr = BLangVMErrors.getPrintableStackTrace(context.getError());
throw new BLangRuntimeException("error: " + stackTraceStr);
}
}
use of org.ballerinalang.bre.bvm.WorkerExecutionContext in project ballerina by ballerina-lang.
the class BLangFunctions method invokeEntrypointCallable.
public static BValue[] invokeEntrypointCallable(ProgramFile programFile, PackageInfo packageInfo, FunctionInfo functionInfo, BValue[] args) {
WorkerExecutionContext parentCtx = new WorkerExecutionContext(programFile);
if (functionInfo.getParamTypes().length != args.length) {
throw new RuntimeException("Size of input argument arrays is not equal to size of function parameters");
}
invokePackageInitFunction(packageInfo.getInitFunctionInfo(), parentCtx);
invokeVMUtilFunction(packageInfo.getStartFunctionInfo(), parentCtx);
BValue[] result = invokeCallable(functionInfo, parentCtx, args);
BLangScheduler.waitForWorkerCompletion();
return result;
}
use of org.ballerinalang.bre.bvm.WorkerExecutionContext in project ballerina by ballerina-lang.
the class BLangFunctions method invokeNonNativeCallableAsync.
public static void invokeNonNativeCallableAsync(CallableUnitInfo callableUnitInfo, WorkerExecutionContext parentCtx, int[] argRegs, int[] retRegs) {
WorkerSet workerSet = callableUnitInfo.getWorkerSet();
int generalWorkersCount = workerSet.generalWorkers.length;
AsyncInvocableWorkerResponseContext respCtx = new AsyncInvocableWorkerResponseContext(callableUnitInfo, generalWorkersCount);
WorkerDataIndex wdi = callableUnitInfo.retWorkerIndex;
/* execute the init worker and extract the local variables created by it */
WorkerData initWorkerLocalData = null;
CodeAttributeInfo initWorkerCAI = null;
if (workerSet.initWorker != null) {
initWorkerLocalData = executeInitWorker(parentCtx, argRegs, callableUnitInfo, workerSet.initWorker, wdi);
if (initWorkerLocalData == null) {
handleError(parentCtx);
return;
}
initWorkerCAI = workerSet.initWorker.getCodeAttributeInfo();
}
List<WorkerExecutionContext> workerExecutionContexts = new ArrayList<>();
/* execute all the workers in their own threads */
for (int i = 0; i < generalWorkersCount; i++) {
workerExecutionContexts.add(executeWorker(respCtx, parentCtx, argRegs, callableUnitInfo, workerSet.generalWorkers[i], wdi, initWorkerLocalData, initWorkerCAI, false));
}
/* set the worker execution contexts in the response context, so it can use them to do later
* operations such as cancel */
respCtx.setWorkerExecutionContexts(workerExecutionContexts);
/* create the future encapsulating the worker response context, and set it as the return value
* to the parent */
BLangVMUtils.populateWorkerDataWithValues(parentCtx.workerLocal, retRegs, new BValue[] { new BCallableFuture(callableUnitInfo.getName(), respCtx) }, new BType[] { BTypes.typeFuture });
return;
}
Aggregations