From 1b450135a351118b2deaf955441fcb61a54e5f68 Mon Sep 17 00:00:00 2001 From: chenraozhong Date: Tue, 26 Nov 2024 19:59:48 +0800 Subject: [PATCH] cherry pick 3c5f75c from https://gitee.com/wang-yimin15/third_party_node/pulls/189 support microtask policy Signed-off-by: wangyimin --- src/js_native_api_v8.cc | 18 ++++++++++++++++++ src/jsvm.h | 12 ++++++++++++ src/jsvm_types.h | 14 ++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index a61038398..cea3a11b5 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -1484,6 +1484,24 @@ OH_JSVM_CreateVM(const JSVM_CreateVMOptions* options, JSVM_VM* result) { return JSVM_OK; } +JSVM_Status OH_JSVM_SetMicrotaskPolicy(JSVM_VM vm, + JSVM_MicrotaskPolicy policy) { + static constexpr v8::MicrotasksPolicy converter[] = { + v8::MicrotasksPolicy::kExplicit, + v8::MicrotasksPolicy::kAuto + }; + constexpr size_t policyCount = node::arraysize(converter); + + if (!vm || policy >= policyCount) { + return JSVM_INVALID_ARG; + } + + auto isolate = reinterpret_cast(vm); + isolate->SetMicrotasksPolicy(converter[policy]); + + return JSVM_OK; +} + JSVM_Status JSVM_CDECL OH_JSVM_DestroyVM(JSVM_VM vm) { if (vm == nullptr) { diff --git a/src/jsvm.h b/src/jsvm.h index 41a7f81f3..8c566ab0e 100644 --- a/src/jsvm.h +++ b/src/jsvm.h @@ -118,6 +118,18 @@ JSVM_EXTERN JSVM_Status OH_JSVM_Init(const JSVM_InitOptions* options); JSVM_EXTERN JSVM_Status OH_JSVM_CreateVM(const JSVM_CreateVMOptions* options, JSVM_VM* result); +/** + * @brief This function controls how Microtasks are invoked of the vm. If the method is not + * called, the default microtask policy of vm is JSVM_MicrotaskPolicy::JSVM_MICROTASK_AUTO. + * + * @param vm The VM instance to set mircrotasks policy. + * @param policy Policy for running microtasks. + * @return Returns JSVM_OK if the API succeeded. + * @since 16 + */ +JSVM_EXTERN JSVM_Status OH_JSVM_SetMicrotaskPolicy(JSVM_VM vm, + JSVM_MicrotaskPolicy policy); + /** * @brief Destroys VM instance. * diff --git a/src/jsvm_types.h b/src/jsvm_types.h index 139fec1b6..047d7dd8d 100644 --- a/src/jsvm_types.h +++ b/src/jsvm_types.h @@ -768,4 +768,18 @@ typedef enum { JSVM_UNINITIALIZED, } JSVM_InitializedFlag; /** @} */ + +/** + * @brief Microtask policies of JSVM. + * + * @since 16 + */ +typedef enum { + /** Microtasks are invoked with the OH_JSVM_PerformMicrotaskCheckpoint() method. */ + JSVM_MICROTASK_EXPLICIT = 0, + /** Microtasks are invoked when the script call depth decrements to zero. + * Default mode. + */ + JSVM_MICROTASK_AUTO, +} JSVM_MicrotaskPolicy; #endif /* ARK_RUNTIME_JSVM_JSVM_TYPE_H */ -- Gitee