diff --git a/static_core/plugins/ets/stdlib/escompat/Atomics.ets b/static_core/plugins/ets/stdlib/escompat/Atomics.ets index 8bc0f6ea8e61c42dd5588349adb181deac4ee1bb..21ceeba01f489524e2fe47c4f1808c136da1b947 100644 --- a/static_core/plugins/ets/stdlib/escompat/Atomics.ets +++ b/static_core/plugins/ets/stdlib/escompat/Atomics.ets @@ -14,7 +14,7 @@ */ package escompat; -import { launch } from "std/concurrency" +import { Launch } from "std/concurrency" class Waiter { public static okStatus: string = "ok"; @@ -702,7 +702,7 @@ export class Atomics { rejecter!(e as Error) } } - launch void>(cb) + Launch.launch void>(cb) return p; } diff --git a/static_core/plugins/ets/stdlib/escompat/taskpool.ets b/static_core/plugins/ets/stdlib/escompat/taskpool.ets index 0aa99a6698c99e1358174350acf5e37661312697..9b6ea3b20d7de7efa3f919bfc55f4aba2cfb16f2 100644 --- a/static_core/plugins/ets/stdlib/escompat/taskpool.ets +++ b/static_core/plugins/ets/stdlib/escompat/taskpool.ets @@ -15,7 +15,7 @@ package escompat; -import {launch, CoroutineId, WorkerId} from "std/concurrency" +import {Launch, CoroutineId, WorkerId} from "std/concurrency" import { InteropSerializeHelper } from "std/interop"; export namespace taskpool { @@ -1832,7 +1832,7 @@ export namespace taskpool { * @param priority task execution priority */ function launchImpl(task: Task, priority?: Priority): Promise { - const job: Job = launch Any>( + const job: Job = Launch.launch Any>( InternalTask.of(task).execute ); let promise = new Promise((resolve, reject) => { @@ -1923,6 +1923,6 @@ function launchPromise(f: Function, ...args: FixedArray): Promise { rejecter!(e as Error) } } - launch void>(cb) + Launch.launch void>(cb) return p; } diff --git a/static_core/plugins/ets/stdlib/std/concurrency/ConcurrencyHelpers.ets b/static_core/plugins/ets/stdlib/std/concurrency/ConcurrencyHelpers.ets index 7f58a7ce16974a2b4fdf77fd60d35022f0c06c23..8af78ef2133ce02b086243aa054a5a4a5f19863c 100644 --- a/static_core/plugins/ets/stdlib/std/concurrency/ConcurrencyHelpers.ets +++ b/static_core/plugins/ets/stdlib/std/concurrency/ConcurrencyHelpers.ets @@ -15,7 +15,7 @@ package std.concurrency; -import { launch } from "std/concurrency" +import { Launch } from "std/concurrency" /// This class provides api for sync primitives (see SyncPrimitives.ets) final class ConcurrencyHelpers { @@ -41,7 +41,7 @@ class NativeAsyncWorkHelper { NativeAsyncWorkHelper.queueInternal(executeCb, completeCb, data); } static async queueInternal(executeCb: long, completeCb: long, data: long) { - let p = launch void>(NativeAsyncWorkHelper.asyncWorkNativeInvokeInternal, executeCb, data, true); + let p = Launch.launch void>(NativeAsyncWorkHelper.asyncWorkNativeInvokeInternal, executeCb, data, true); p.Await(); NativeAsyncWorkHelper.asyncWorkNativeInvokeInternal(completeCb, data, false); } @@ -60,10 +60,10 @@ class NativeAsyncWorkHelper { }; if (timeout > 0) { setTimeout(() => { - launch void>(NativeAsyncWorkHelper.eventNativeInvokeInternal, launchParams, executeCb, data, true); + Launch.launch void>(NativeAsyncWorkHelper.eventNativeInvokeInternal, launchParams, executeCb, data, true); }, timeout.toInt()); } else { - launch void>(NativeAsyncWorkHelper.eventNativeInvokeInternal, launchParams, executeCb, data, true); + Launch.launch void>(NativeAsyncWorkHelper.eventNativeInvokeInternal, launchParams, executeCb, data, true); } } static eventNativeInvokeInternal(nativeCb: long, data: long, needNativeScope: boolean) { diff --git a/static_core/plugins/ets/stdlib/std/concurrency/Launch.ets b/static_core/plugins/ets/stdlib/std/concurrency/Launch.ets index 0521b74131528418937cff05f747c7889853574d..d8f70fe24509af129e61c7a7f2f3cdd9e8aa6c9b 100644 --- a/static_core/plugins/ets/stdlib/std/concurrency/Launch.ets +++ b/static_core/plugins/ets/stdlib/std/concurrency/Launch.ets @@ -15,7 +15,7 @@ package std.concurrency; -type CoroFunT = ( +export type CoroFunT = ( a0: A, a1: A, a2: A, @@ -42,9 +42,6 @@ type CoroFunT = ( * * @returns instance of the Job class that represents newly launched coroutine. */ -export function launch>(coroFun: F, ...args: FixedArray): Job { - return launchInternal(coroFun, args as FixedArray); -} /** * @enum WorkerDomain The existing worker domains. A worker domain defines a group of workers with some common @@ -119,8 +116,16 @@ export class LaunchParams { * * @returns instance of the Job class that represents newly launched coroutine. */ -export function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job { - return launchInternal(coroFun, args as FixedArray, launchParams); + + +export class Launch { + internal static launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job { + return launchInternal(coroFun, args as FixedArray, launchParams); + } + + internal static launch>(coroFun: F, ...args: FixedArray): Job { + return launchInternal(coroFun, args as FixedArray); + } } /** diff --git a/static_core/plugins/ets/stdlib/std/concurrency/MessageHandler.ets b/static_core/plugins/ets/stdlib/std/concurrency/MessageHandler.ets index 067d775a09bc65ab451fd776078b6b174612e701..70ddfee4b62002f989b773f01660c488da008f42 100644 --- a/static_core/plugins/ets/stdlib/std/concurrency/MessageHandler.ets +++ b/static_core/plugins/ets/stdlib/std/concurrency/MessageHandler.ets @@ -15,7 +15,7 @@ package std.concurrency; -import { launch } from "std/concurrency"; +import { Launch } from "std/concurrency"; type Handler = (message: concurrency.Message) => void; type Task = () => void; diff --git a/static_core/plugins/ets/stdlib/std/core/EAWorker.ets b/static_core/plugins/ets/stdlib/std/core/EAWorker.ets index d10a7c852256cbeed4e006974398984c5aa959bc..8a0b65332acd45d27df061e850c46b6f63db41c7 100644 --- a/static_core/plugins/ets/stdlib/std/core/EAWorker.ets +++ b/static_core/plugins/ets/stdlib/std/core/EAWorker.ets @@ -15,7 +15,7 @@ package std.core; -import { launch } from "std/concurrency"; +import { Launch } from "std/concurrency"; import { InteropSerializeHelper } from "std/interop"; type Task = () => void; diff --git a/static_core/plugins/ets/tests/concurrency/concurrency_tests.ets b/static_core/plugins/ets/tests/concurrency/concurrency_tests.ets new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/static_core/plugins/ets/tests/ets_test_suite/CMakeLists.txt b/static_core/plugins/ets/tests/ets_test_suite/CMakeLists.txt index 3d9faf455aafec145ffe99543b619063b08c18ec..107602bae471b45d22f2371f9c44916d1976bcf9 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/CMakeLists.txt +++ b/static_core/plugins/ets/tests/ets_test_suite/CMakeLists.txt @@ -41,6 +41,11 @@ function(add_ets_test test_suite) RUNTIME_EXTRA_OPTIONS ${ARG_OPTIONS} COMPILER_EXTRA_OPTIONS ${ARG_COMPILER_EXTRA_OPTIONS} ) + if(${target} MATCHES "ets_test_suite_coroutines") + # add_custom_targer + add_dependencies(${target} launch_ani) + message(${all_modes_tests}) + endif() add_dependencies(${all_modes_tests} ${target}) endif() @@ -89,6 +94,9 @@ function(add_ets_test test_suite) endif() foreach(target ${targets}) + if(${target} MATCHES "ets_test_suite_coroutines") + add_dependencies(${target} launch_ani) + endif() if (TARGET ${target}) add_dependencies(${all_modes_tests} ${target}) endif() diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/CMakeLists.txt b/static_core/plugins/ets/tests/ets_test_suite/coroutines/CMakeLists.txt index 211df5eee482cd6abe95dde75741b8da011bcd70..33e581b4c4fafc9cac3870e130dc9dc786df96a9 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/CMakeLists.txt +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/CMakeLists.txt @@ -13,6 +13,26 @@ add_custom_target(ets_test_suite_coroutines) +set(GEN_ANI_ETSNAPI_LIB_DIR "${CMAKE_CURRENT_BINARY_DIR}") + +panda_add_library(launch_ani SHARED launch_ani.cpp) + +set_target_properties(launch_ani PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${GEN_ANI_ETSNAPI_LIB_DIR}) + +panda_target_link_libraries(launch_ani arkruntime gtest) + +panda_target_include_directories(launch_ani + PRIVATE ${PANDA_ETS_PLUGIN_SOURCE}/runtime/ani +) + +set(PANDA_RUN_PREFIX + LD_LIBRARY_PATH=${GEN_ANI_ETSNAPI_LIB_DIR} + ${PANDA_RUN_PREFIX}) + + +add_dependencies(ets_test_suite_coroutines launch_ani) + + # Add ets coroutine tests targets # # Example usage: diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/affinity.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/affinity.ets index 19d1c21edb699ae2ce9de80807adea2b04f6078d..61de9f24ccdefedc2583ea61d2cf5b4e6b0f7fb6 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/affinity.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/affinity.ets @@ -15,7 +15,8 @@ import {CoroutineExtras, AtomicFlag} from "std/debug/concurrency" import {StdDebug} from "std/debug" -import { launch } from "std/concurrency" +// import { launch } from "std/concurrency" +// import { launch } from "./coroHelp" import { Job } from "std/core" type L = StdDebug.Logger @@ -109,9 +110,14 @@ function testExclusiveLaunchFlag(): void { // NOTE(konstanting): will be added later (see #14697) } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + function main(): int { // Call L's enableLogging method to enable logs. + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.affinity'); testSuite.addTest('testAsyncDefaultPolicy', testAsyncDefaultPolicy); testSuite.addTest('testAsyncNonMainPolicy', testAsyncNonMainPolicy); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/allhandled_rejection.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/allhandled_rejection.ets index 7668070d3d16712cdfaa668a16c27a54fa9d1d44..d3defade340659db400bc65caa31ae17b39d5c07 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/allhandled_rejection.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/allhandled_rejection.ets @@ -79,7 +79,12 @@ function testAllhandledRejection(): void { launch null>(SingleRejectedJob); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.allhandled_rejection'); testSuite.addTest('testAllhandledRejection', testAllhandledRejection); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/async_call.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/async_call.ets index 2e3d92adc852506856ea5b9735d2e03b009c5b4d..7d7c0c1486398051bcb3ddb72e1f799b146b23c3 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/async_call.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/async_call.ets @@ -260,6 +260,8 @@ async function testArm64LargeFuncCall(): Promise { await p; } +native function nativeTestFunction(a: long): long; + function main(): int { let testSuite = new arktest.ArkTestsuite('coroutines.async_call'); testSuite.addAsyncTest('testNoArgsStaticFuncCall', testNoArgsStaticFuncCall); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/await.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/await.ets index 560d0f4420a8b034a5efb02be1d0801dc9373598..0533a4b3113a875a3d48e62f48671a373d559a76 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/await.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/await.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import {launch} from "std/concurrency"; +//import {launch} from "std/concurrency"; import {Job} from "std/core"; let flag = false; @@ -95,7 +95,12 @@ function testAwaitForObject() { checkReturnType(getObject); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.await'); testSuite.addTest('testAwaitForString', testAwaitForString); testSuite.addTest('testAwaitForInt', testAwaitForInt); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/await_migrate.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/await_migrate.ets index bdb1cea271547ccda814c3fa822bd061733b1aa2..6a9d490c24b6317829cddf7d908a80c5f40ffd4a 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/await_migrate.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/await_migrate.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +// import { launch } from "std/concurrency" import { Job } from "std/core" let isLaunchMigrated: AtomicFlag = new AtomicFlag(false); @@ -57,7 +57,13 @@ function testAwaitMigration(): void { CoroutineExtras.setSchedulingPolicy(CoroutineExtras.POLICY_ANY); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.await_migrate'); testSuite.addTest('testAwaitMigration', testAwaitMigration); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/class_load_race.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/class_load_race.ets index 39de1888832d57b3efef7e2c63c4c971da25fbb2..ee669eb881ac2e6406665879da09697717887fbd 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/class_load_race.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/class_load_race.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" type L = StdDebug.Logger @@ -48,7 +48,13 @@ function testRaceInTheCCtor(): void { } } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.class_load_race'); testSuite.addTest('testRaceInTheCCtor', testRaceInTheCCtor); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/concurrent_await.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/concurrent_await.ets index 626a00c633acdbb449147ac8154fc0dbea269aa7..1efe20e710ec2b13ccead7acf6d97c76410e3b52 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/concurrent_await.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/concurrent_await.ets @@ -14,7 +14,7 @@ */ import {AtomicFlag} from "std/debug/concurrency" -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" import { Job } from "std/core" class Event { @@ -54,7 +54,13 @@ function testConcurrentAwait(): void { arktest.assertEQ(result, 42); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.concurrent_await'); testSuite.addTest('testConcurrentAwait', testConcurrentAwait); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/coroHelp.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/coroHelp.ets new file mode 100644 index 0000000000000000000000000000000000000000..77a2c2877a919dd3467e61a79ac61144ade1da56 --- /dev/null +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/coroHelp.ets @@ -0,0 +1,7 @@ +export native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +export native function launch>(coroFun: F, ...args: FixedArray): Job + +function main(): int { + loadLibrary('launch_ani'); +} \ No newline at end of file diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/eaworker_coroutines.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/eaworker_coroutines.ets index 9b02b3b5476dc2b775b139f0eb4a27e9e27a25b5..135fab2cd8ff4f63d0b66a2772040bbd2aa1118f 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/eaworker_coroutines.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/eaworker_coroutines.ets @@ -218,7 +218,13 @@ function testNestedEAWorker(): void { arktest.assertEQ(EXPECTED_VALUE, result); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); const suite = new arktest.ArkTestsuite('EAWorker Test Suite'); suite.addTest('testACoroutineEaworker', testACoroutineEaworker); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/eworker_post_to_main.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/eworker_post_to_main.ets index 29dfa56601259973bc08ff02e87d344130a616c2..631c23b3228b6bb6aa1db130ee9c44d2ba0f3791 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/eworker_post_to_main.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/eworker_post_to_main.ets @@ -42,7 +42,13 @@ function testEworkerPost2Main() { arktest.assertNE(runId1, runId3); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.eworker_post_to_main'); testSuite.addTest('testEworkerPost2Main', testEworkerPost2Main); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/execution_order.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/execution_order.ets index 6ba94db27b4aedb987acee57eba3ba0ad2b928cb..393edb3ed75f7f4dfd2d805a71728230e0388a87 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/execution_order.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/execution_order.ets @@ -128,7 +128,13 @@ async function testWithAsyncPromiseThen() { executionOrder.checkOrder(); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.execution_order'); testSuite.addAsyncTest('testWithPendingPromise', testWithPendingPromise); testSuite.addAsyncTest('testWithResolvedPromise', testWithResolvedPromise); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch.ets index 2878abe14b7ea3d0d0fa06ec0caffed3877b855b..bee53c13c07b8c46df66c1f1c96d5b16b9845b58 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch.ets @@ -127,8 +127,12 @@ function testLaunchStatic(): void { arktest.assertEQ(s2Result, 's2: C.s2_arg_0 2.73 MyPayload.s=3.14'); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.launch'); testSuite.addTest('testLaunchLambdas', testLaunchLambdas); testSuite.addTest('testLaunchFunctions', testLaunchFunctions); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_ani.cpp b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_ani.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dc6409f9e24344742c1e33af8a78709a37508c39 --- /dev/null +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_ani.cpp @@ -0,0 +1,90 @@ +#include "plugins/ets/runtime/ani/ani.h" +#include +#include +#include + +static ani_ref LaunchFLO([[maybe_unused]] ani_env *env, ani_fn_object coroFun, ani_class launchParams, + ani_fixedarray args) +{ + ani_class cls = nullptr; + if (ANI_OK != env->FindClass("std.concurrency.Launch", &cls)) { + std::cerr << "Not found '" + << "std.concurrency.Launch" + << "'" << std::endl; + } + + ani_static_method method; + if (ANI_OK != env->Class_FindStaticMethod( + cls, "launch", + "C{std.core.Function16}C{std.concurrency.LaunchParams}A{C{std.core.Object}}:C{std.core.Job}", + &method)) { + std::cerr << "Not found '" + << "LaunchFLO" + << "'" << std::endl; + } + + ani_ref value = nullptr; + if (ANI_OK != env->Class_CallStaticMethod_Ref(cls, method, &value, coroFun, launchParams, args)) { + std::cerr << "Not found '" + << "LaunchFO" + << "'" << std::endl; + } + return value; +} + +static ani_ref LaunchFO([[maybe_unused]] ani_env *env, ani_fn_object coroFun, ani_fixedarray args) + + ani_class cls = nullptr; + if (ANI_OK != env->FindClass("std.concurrency.Launch", &cls)) { + std::cerr << "Not found '" + << "std.concurrency.Launch" + << "'" << std::endl; + } + + ani_static_method method; + if (ANI_OK != env->Class_FindStaticMethod(cls, "launch", + "C{std.core.Function16}A{C{std.core.Object}}:C{std.core.Job}", &method)) { + std::cerr << "Not found '" + << "LaunchFO" + << "'" << std::endl; + } + + ani_ref value = nullptr; + if (ANI_OK != env->Class_CallStaticMethod_Ref(cls, method, &value, coroFun, args)) { + std::cerr << "Not found '" + << "LaunchFO" + << "'" << std::endl; + } + return value; +} + +ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) +{ + ani_env *env; + if (vm->GetEnv(ANI_VERSION_1, &env) != ANI_OK) { + return ANI_ERROR; + } + std::array methods = { + ani_native_function { + "launch", "C{std.core.Function16}C{std.concurrency.LaunchParams}A{C{std.core.Object}}:C{std.core.Job}", + reinterpret_cast(LaunchFLO)}, + ani_native_function {"launch", "C{std.core.Function16}A{C{std.core.Object}}:C{std.core.Job}", + reinterpret_cast(LaunchFO)}, + }; + + std::vector modules {"affinity", "allhandled_rejection" , "await_migrate", \ + "await", "class_load_race", "concurrent_await", "eaworker_coroutines", "eworker_post_to_main", "execution_order", "launch_exception", \ + "launch_instr_array", "launch_instruction", "launch", "launch_launch", "launch_n_workers", "launch_oom", "launch_yield", + "multiple_launch", "scale_workers_pool", "setTimeout", "stats", "sync_primitives", "unhandled_rejection", "unhandled_rejection_event", "worker_group"}; + + for(auto &module_name : modules) { + ani_module module_bind; + if (env->FindModule(module_name, &module_bind) == ANI_OK) { + if (env->Module_BindNativeFunctions(module_bind, methods.data(), methods.size()) != ANI_OK) { + std::cerr << "Cannot bind native functions!" << std::endl; + } + } + } + *result = ANI_VERSION_1; + return ANI_OK; +} \ No newline at end of file diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_exception.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_exception.ets index cd441a5aa55d69f3d08fda4b9081fd51c4b4e334..6f6aa7199e2a1b5843e3e94cd2d9078682228e1d 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_exception.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_exception.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" let counter = 0; @@ -80,7 +80,13 @@ function testLaunchError() { arktest.assertEQ(res, true); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.launch_error'); testSuite.addTest('testLaunchStackOverflow', testLaunchStackOverflow); testSuite.addTest('testLaunchError', testLaunchError); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instr_array.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instr_array.ets index b8d6575b69ec299e4e03acf10d4360f264bb31a4..41e0b458b8a129e05268113f9a5129fbdad649b8 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instr_array.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instr_array.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" import { Job } from "std/core" // This test covers case of storing Promises returned from launch instruction @@ -41,7 +41,13 @@ function testLaunchInstrArray(): void { a.run(); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.launch_instr_array'); testSuite.addTest('testLaunchInstrArray', testLaunchInstrArray); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instruction.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instruction.ets index 1370c53ffe8ef4a69eedd08557663e1a52d36231..83f4d8bac7a36c9f95128d35098052f112cacd9a 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instruction.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_instruction.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" function noarg(): Object | null { return null; @@ -84,7 +84,13 @@ function testLaunchFiveArgs(): void { Coroutine.Schedule(); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); // These tests must be run with exactly one coroutine worker thread due to it's design. let testSuite = new arktest.ArkTestsuite('coroutines.launch_instruction'); testSuite.addTest('testLaunchNoArgs', testLaunchNoArgs); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_n_workers.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_n_workers.ets index 9efb2a09a56dda2ddf613070362c889d3c12aebb..5d81276f04605c772b637f41d48cdeec1a8c8171 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_n_workers.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_n_workers.ets @@ -15,7 +15,7 @@ import {StdDebug} from "std/debug" import {CoroutineExtras} from "std/debug/concurrency" -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" type L = StdDebug.Logger @@ -142,7 +142,13 @@ function testRunBatchAwait(): void { } } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.launch_error'); testSuite.addTest('testCompareWorkerIdsAsync', testCompareWorkerIdsAsync); testSuite.addTest('testCompareWorkerIds', testCompareWorkerIds); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_oom.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_oom.ets index a5ca6764a3596abae7bede641bc93fbb0eedb0b1..3ca7f12da969d45ad45c735bec13235228d16988 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_oom.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_oom.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" type L = StdDebug.Logger @@ -39,7 +39,13 @@ function testLaunchOOM(): void { arktest.assertTrue(false, 'No error thrown but should be!'); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.launch_oom'); testSuite.addTest('testLaunchOOM', testLaunchOOM); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_yield.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_yield.ets index 090785ffae7f25ba27c42ea6a75d09afddbb7b78..2a21e1f18d7cedd1f2c6ed2455ebec3128220a25 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_yield.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/launch_yield.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" let counter = 0; @@ -30,7 +30,13 @@ function testLaunchYield(): void { } } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.launch_yield'); testSuite.addTest('testLaunchYield', testLaunchYield); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/multiple_launch.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/multiple_launch.ets index d11d68314273ad46c8c504f4bd0fcd3de23fa8e4..6edfa4b2bc76a86d6e2ef95609a2eb5c9c848ec0 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/multiple_launch.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/multiple_launch.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +// import { launch } from "std/concurrency" import { Job } from "std/core" type L = StdDebug.Logger @@ -101,7 +101,13 @@ function testMultipleLaunch(): void { } } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.multiple_launch'); testSuite.addTest('testMultipleLaunch', testMultipleLaunch); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/scale_workers_pool.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/scale_workers_pool.ets index 4a667e7b07fa7f46de23c5c94e57b28b1ad8cad4..695ae4e61e74c9039742bf35a635e57a28155b85 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/scale_workers_pool.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/scale_workers_pool.ets @@ -27,7 +27,13 @@ function testScaleWorkersPool() { arktest.assertEQ(mainId, workerId); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.scale_workers_pool'); testSuite.addTest('testScaleWorkersPool', testScaleWorkersPool); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/setTimeout.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/setTimeout.ets index daf78e64aefa867a968d42b67e9d79e9dfe5f89b..f3bfd7150c2314015360579ab543f309a114dff6 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/setTimeout.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/setTimeout.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" let zeroTimeout = 0; let shortTimeout = 10; @@ -264,7 +264,13 @@ function testSameWorkerIdTestLaunch() { launch void>(sameWorkerIdTest); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); CoroutineExtras.setSchedulingPolicy(CoroutineExtras.POLICY_NON_MAIN); let testSuite = new arktest.ArkTestsuite('coroutines.setTimeout'); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/stats.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/stats.ets index c6d950e9996b79ec4d5bf2a06ac85ff077f65826..0bf95df971e6cda4d222e94075c1e51f15023670 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/stats.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/stats.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { launch } from "std/concurrency" +//import { launch } from "std/concurrency" // This test checks if the coroutine statistics engine works correctly. @@ -40,7 +40,13 @@ async function testCoroStats(): Promise { } } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.stats'); testSuite.addAsyncTest('testCoroStats', testCoroStats); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/sync_primitives.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/sync_primitives.ets index d6bbe1a89469d6f70580a898809b4edfd6bc8922..80d60a5568c87342ee7c3852050c3d3b2e106257 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/sync_primitives.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/sync_primitives.ets @@ -117,7 +117,13 @@ function exclusiveRWLockTest() { exclusiveLockTest(new RWLock().writeLock()); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main() { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.sync_primitives'); testSuite.addTest('exclusiveMutexLockTest', exclusiveMutexLockTest); testSuite.addTest('exclusiveRWLockTest', exclusiveRWLockTest); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection.ets index 3d97e2ce32e8e2a827118057feb2e5f0ca3fb0d6..30e4a6fb1ce44511c0b0bc9f8e91cd0ab2ea1356 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection.ets @@ -92,7 +92,13 @@ function testUnhandledRejection(): void { Promise.reject(); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.unhandled_rejection'); testSuite.addTest('testUnhandledRejection', testUnhandledRejection); let res = testSuite.run(); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection_event.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection_event.ets index 6bcb751ee6945efa7d1fcddd9adf106e002c69c5..3befad33e97596c59d17bbf2447615b57f3f6a20 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection_event.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/unhandled_rejection_event.ets @@ -97,7 +97,13 @@ function testAllUnhandledJobRejection(): void { } } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.unhandled_rejection_event'); testSuite.addTest('testUnhandledRejectionObserverRegistration', testUnhandledRejectionObserverRegistration); testSuite.addTest('testAllUnhandledJobRejection', testAllUnhandledJobRejection); diff --git a/static_core/plugins/ets/tests/ets_test_suite/coroutines/worker_group.ets b/static_core/plugins/ets/tests/ets_test_suite/coroutines/worker_group.ets index 40de18a42dadb0d93d8bfa185445731a54eedb6e..569c3795d47e2afb425ae9a4e7a20fe63707d42c 100644 --- a/static_core/plugins/ets/tests/ets_test_suite/coroutines/worker_group.ets +++ b/static_core/plugins/ets/tests/ets_test_suite/coroutines/worker_group.ets @@ -187,7 +187,13 @@ function testInvalidGroupId() { arktest.expectThrow(() => { launch void>((): void => {}, params).Await(); }); } +native function launch>(coroFun: F, launchParams: LaunchParams, ...args: FixedArray): Job + +native function launch>(coroFun: F, ...args: FixedArray): Job + + function main(): int { + loadLibrary('launch_ani'); let testSuite = new arktest.ArkTestsuite('coroutines.worker_group'); testSuite.addTest('testEADomain', testEADomain); testSuite.addTest('testGeneralDomain', testGeneralDomain);