From 617a5e71ab4272d330e8daaf8814cc8ed2e7b349 Mon Sep 17 00:00:00 2001 From: warunalakshitha Date: Thu, 26 Sep 2024 13:34:47 +0530 Subject: [PATCH] Remove yield gen before terminators --- .../runtime/internal/BalEnvironment.java | 4 +-- .../runtime/internal/lock/BLockStore.java | 2 ++ .../compiler/bir/codegen/JvmCodeGenUtil.java | 28 ------------------- .../bir/codegen/JvmTerminatorGen.java | 2 ++ .../bir/codegen/methodgen/MethodGen.java | 2 -- .../ballerinalang/langlib/runtime/Sleep.java | 4 ++- .../test/utils/interop/Utils.java | 1 + 7 files changed, 10 insertions(+), 33 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/BalEnvironment.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/BalEnvironment.java index 4eb22e2b6f53..e4de10acc327 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/BalEnvironment.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/BalEnvironment.java @@ -81,8 +81,8 @@ public Parameter[] getFunctionPathParameters() { /** * Mark the current executing strand as async. Execution of Ballerina code after the current - * interop will stop until given BalFuture is completed. However the java thread will not be blocked - * and will be reused for running other Ballerina code in the meantime. Therefore callee of this method + * interop will stop until given BalFuture is completed. However, the java thread will not be blocked + * and will be reused for running other Ballerina code in the meantime. Therefore, callee of this method * must return as soon as possible to avoid starvation of ballerina code execution.WD */ @Override diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/lock/BLockStore.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/lock/BLockStore.java index a0d173d5d72a..e5f13f8a4cca 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/lock/BLockStore.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/lock/BLockStore.java @@ -51,8 +51,10 @@ public BLockStore() { */ @SuppressWarnings("unused") public void lock(Strand strand, String lockName) { + strand.yield(); getLockFromMap(lockName).lock(); strand.acquiredLockCount++; + strand.resume(); } /* diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java index 2f60f28f0676..368f07201607 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java @@ -35,8 +35,6 @@ import org.wso2.ballerinalang.compiler.bir.codegen.internal.NameHashComparator; import org.wso2.ballerinalang.compiler.bir.codegen.internal.ScheduleFunctionInfo; import org.wso2.ballerinalang.compiler.bir.codegen.interop.InteropMethodGen; -import org.wso2.ballerinalang.compiler.bir.codegen.model.JTermKind; -import org.wso2.ballerinalang.compiler.bir.codegen.model.JTerminator; import org.wso2.ballerinalang.compiler.bir.codegen.model.JType; import org.wso2.ballerinalang.compiler.bir.codegen.model.JTypeTags; import org.wso2.ballerinalang.compiler.bir.codegen.split.JvmConstantsGen; @@ -503,32 +501,6 @@ public static BirScope getLastScopeFromTerminator(MethodVisitor mv, BIRNode.BIRB return lastScope; } - public static void genStrandAction(MethodVisitor mv, BIRTerminator terminator, int localVarOffset, - String strandAction) { - switch (terminator.kind) { - case WK_RECEIVE, WK_ALT_RECEIVE, WK_MULTIPLE_RECEIVE, FLUSH, WAIT, WAIT_ALL: - genStrandAction(mv, localVarOffset, strandAction); - break; - case WK_SEND: - if (((BIRTerminator.WorkerSend) terminator).isSync) { - genStrandAction(mv, localVarOffset, strandAction); - } - break; - case PLATFORM: - if (terminator instanceof JTerminator jTerminator && - jTerminator.jTermKind == JTermKind.JI_METHOD_CALL) { - genStrandAction(mv, localVarOffset, strandAction); - } - break; - default: - } - } - - private static void genStrandAction(MethodVisitor mv, int localVarOffset, String strandAction) { - mv.visitVarInsn(ALOAD, localVarOffset); - mv.visitMethodInsn(INVOKEVIRTUAL, STRAND_CLASS, strandAction, VOID_METHOD_DESC, false); - } - public static void genGotoThenBB(MethodVisitor mv, BIRNode.BIRBasicBlock thenBB, LabelGenerator labelGen, BIRTerminator terminator, String funcName) { if (thenBB != null) { diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTerminatorGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTerminatorGen.java index 0a09e26116b2..7e995418d77e 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTerminatorGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTerminatorGen.java @@ -511,6 +511,8 @@ private void genJICallTerm(JIMethodCall callIns, int localVarOffset, BIRNode.BIR if (callIns.lhsOp != null && callIns.lhsOp.variableDcl != null) { this.storeToVar(callIns.lhsOp.variableDcl); } + mv.visitVarInsn(ALOAD, localVarOffset); + mv.visitMethodInsn(INVOKEVIRTUAL, STRAND_CLASS, "resume", VOID_METHOD_DESC, false); } private void genJIConstructorTerm(JIConstructorCall callIns) { diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java index fb57fe926ac2..fd6d717c40fc 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java @@ -535,7 +535,6 @@ void generateBasicBlocks(MethodVisitor mv, LabelGenerator labelGen, JvmErrorGen mv.visitLabel(bbEndLabel); BIRTerminator terminator = bb.terminator; processTerminator(mv, func, module, funcName, terminator); - JvmCodeGenUtil.genStrandAction(mv, terminator, localVarOffset, "yield"); termGen.genTerminator(terminator, func, funcName, localVarOffset, returnVarRefIndex, attachedType, channelMapVarIndex, sendWorkerChannelNamesVar, receiveWorkerChannelNamesVar); lastScope = JvmCodeGenUtil.getLastScopeFromTerminator(mv, bb, funcName, labelGen, lastScope, @@ -543,7 +542,6 @@ void generateBasicBlocks(MethodVisitor mv, LabelGenerator labelGen, JvmErrorGen errorGen.generateTryCatch(func, funcName, bb, termGen, labelGen, channelMapVarIndex, sendWorkerChannelNamesVar, receiveWorkerChannelNamesVar, localVarOffset); BIRBasicBlock thenBB = terminator.thenBB; - JvmCodeGenUtil.genStrandAction(mv, terminator, localVarOffset, "resume"); JvmCodeGenUtil.genGotoThenBB(mv, thenBB, labelGen, terminator, funcName); } } diff --git a/langlib/lang.runtime/src/main/java/org/ballerinalang/langlib/runtime/Sleep.java b/langlib/lang.runtime/src/main/java/org/ballerinalang/langlib/runtime/Sleep.java index 2a66391c4f01..18415b7bb27b 100644 --- a/langlib/lang.runtime/src/main/java/org/ballerinalang/langlib/runtime/Sleep.java +++ b/langlib/lang.runtime/src/main/java/org/ballerinalang/langlib/runtime/Sleep.java @@ -18,6 +18,7 @@ package org.ballerinalang.langlib.runtime; +import io.ballerina.runtime.api.Environment; import io.ballerina.runtime.api.creators.ErrorCreator; import io.ballerina.runtime.api.utils.StringUtils; import io.ballerina.runtime.api.values.BDecimal; @@ -33,7 +34,7 @@ public class Sleep { private static final BigDecimal LONG_MAX = new BigDecimal(Long.MAX_VALUE); - public static void sleep(BDecimal delaySeconds) { + public static void sleep(Environment env, BDecimal delaySeconds) { BigDecimal delayDecimal = delaySeconds.decimalValue(); if (delayDecimal.compareTo(BigDecimal.ZERO) <= 0) { return; @@ -45,6 +46,7 @@ public static void sleep(BDecimal delaySeconds) { } else { delay = delayDecimal.longValue(); } + env.markAsync(); try { Thread.sleep(delay); } catch (InterruptedException e) { diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/utils/interop/Utils.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/utils/interop/Utils.java index f149e018c0a2..50246b9cad22 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/utils/interop/Utils.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/utils/interop/Utils.java @@ -33,6 +33,7 @@ public class Utils { public static void sleep(Environment env, long delayMillis) { try { + env.markAsync(); Thread.sleep(delayMillis); } catch (InterruptedException e) { throw ErrorCreator.createError(e);