diff --git a/entry/src/main/cpp/napi_init.cpp b/entry/src/main/cpp/napi_init.cpp index 516f274e6e2ee85d81943822e560667ecb5d79e0..6ab1473c7e9187de567cdd89811da2d149edb503 100644 --- a/entry/src/main/cpp/napi_init.cpp +++ b/entry/src/main/cpp/napi_init.cpp @@ -21,6 +21,7 @@ #define LOG_DOMAIN 0x3200 #define LOG_TAG "MY_TAG" +// [Start callback_context] napi_threadsafe_function tsFn; static int g_value = 0; @@ -28,7 +29,9 @@ struct CallbackContext { napi_env env = nullptr; napi_ref callbackRef = nullptr; }; +// [End callback_context] +// [Start sub_thread] void SubThread(CallbackContext *asyncContext) { if (asyncContext == nullptr) { return; @@ -38,7 +41,9 @@ void SubThread(CallbackContext *asyncContext) { napi_call_threadsafe_function(tsFn, asyncContext, napi_tsfn_nonblocking); napi_release_threadsafe_function(tsFn, napi_tsfn_release); } +// [End sub_thread] +// [Start thread_safe_call_js] static void ThreadSafeCallJs(napi_env env, napi_value js_callBack, void *context, void *data) { CallbackContext *argContext = reinterpret_cast(data); if (argContext != nullptr) { @@ -66,7 +71,9 @@ static void ThreadSafeCallJs(napi_env env, napi_value js_callBack, void *context delete argContext; argContext = nullptr; } +// [End thread_safe_call_js] +// [Start thread_safe_case] static napi_value ThreadSafeCase(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value js_callback; @@ -92,11 +99,14 @@ static napi_value ThreadSafeCase(napi_env env, napi_callback_info info) { t.detach(); return nullptr; } +// [End thread_safe_case] - +// [Start uv_loop_async] uv_loop_t *loop = nullptr; uv_async_t *async = nullptr; +// [End uv_loop_async_t] +// [Start async_handler] void async_handler(uv_async_t *handle) { CallbackContext *context = reinterpret_cast(handle->data); napi_handle_scope scope = nullptr; @@ -125,7 +135,9 @@ void async_handler(uv_async_t *handle) { context = nullptr; uv_close((uv_handle_t *)async, [](uv_handle_t *handle) { delete (uv_async_t *)handle; }); } +// [End async_handler] +// [Start callback_uv_work_test] void CallbackUvWorkTest(CallbackContext *context) { if (context == nullptr) { return; @@ -135,8 +147,10 @@ void CallbackUvWorkTest(CallbackContext *context) { async->data = reinterpret_cast(context); uv_async_send(async); } +// [End callback_uv_work_test] static napi_value LibUvCase(napi_env env, napi_callback_info info) { + // [Start lib_uv_case] size_t argc = 1; napi_value callback_function; napi_get_cb_info(env, info, &argc, &callback_function, nullptr, nullptr); @@ -147,20 +161,25 @@ static napi_value LibUvCase(napi_env env, napi_callback_info info) { return nullptr; } + // [Start uv_default_loop] loop = uv_default_loop(); async = new uv_async_t; uv_async_init(loop, async, async_handler); + // [StartExclude uv_default_loop] auto asyncContext = new CallbackContext(); if (asyncContext == nullptr) { return nullptr; } asyncContext->env = env; napi_create_reference(env, callback_function, 1, &asyncContext->callbackRef); + // [End lib_uv_case] + // [EndExclude uv_default_loop] std::thread caseThread(CallbackUvWorkTest, asyncContext); caseThread.detach(); uv_run(loop, UV_RUN_DEFAULT); return nullptr; + // [End uv_default_loop] } EXTERN_C_START diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index d21cad00b1012cc5dcb02efeb089b3b538390dbd..c49046989fe497c078a8c9cf47a91420261bbde9 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -18,6 +18,7 @@ import { promptAction } from '@kit.ArkUI' @Entry @Component struct Index { + // [Start work_function] @State value: number = 0; @State message: ResourceStr = $r('app.string.result_description'); work: Function = (param: number) => { @@ -25,6 +26,7 @@ struct Index { this.value = param; return param; } + // [End work_function] build() { Row() { @@ -60,7 +62,9 @@ struct Index { Button($r('app.string.threadSafe_Case')) .width('100%') .onClick(() => { + // [Start testNapi_thread_safe_case] testNapi.threadSafeCase(this.work); + // [End testNapi_thread_safe_case] promptAction.showToast({ message: $r('app.string.threadSafe_message'), duration: 2000