From babc637bbbd9c75de47da547672df5808b83a622 Mon Sep 17 00:00:00 2001 From: wanglongjin Date: Mon, 19 Sep 2022 06:20:43 +0000 Subject: [PATCH] =?UTF-8?q?uitest=E5=89=8D=E5=90=8E=E7=AB=AF=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E9=94=80=E6=AF=81=E6=9C=BA=E5=88=B6bugfix.=20Signed-o?= =?UTF-8?q?ff-by:=20=20uitest=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=AF=B9=E8=B1=A1=E9=94=80=E6=AF=81=E6=9C=BA=E5=88=B6?= =?UTF-8?q?bugfix.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wanglongjin --- uitest/napi/uitest_napi.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/uitest/napi/uitest_napi.cpp b/uitest/napi/uitest_napi.cpp index e1803a4..f4dde49 100644 --- a/uitest/napi/uitest_napi.cpp +++ b/uitest/napi/uitest_napi.cpp @@ -13,8 +13,10 @@ * limitations under the License. */ +#include #include #include +#include #include #include #include @@ -28,7 +30,7 @@ namespace OHOS::uitest { static constexpr size_t NAPI_MAX_BUF_LEN = 1024; static constexpr size_t NAPI_MAX_ARG_COUNT = 8; - static constexpr size_t BACKEND_OBJ_CLEAN_THRESHOLD = 20; + static constexpr size_t BACKEND_OBJ_GC_BATCH = 100; // type of unexpected or napi-internal error static constexpr napi_status NAPI_ERR = napi_status::napi_generic_failure; // the name of property that represents the objectRef of the backend object @@ -36,7 +38,8 @@ namespace OHOS::uitest { /**For dfx usage, records the uncalled js apis. */ static set g_unCalledJsFuncNames; /**For gc usage, records the backend objRefs about to delete. */ - static set g_backendObjsAboutToDelete; + static queue g_backendObjsAboutToDelete; + static mutex g_gcQueueMutex; // use external setup/transact/disposal callback functions extern bool SetupTransactionEnv(string_view token); @@ -196,7 +199,7 @@ namespace OHOS::uitest { napi_value refValue = *pOut; napi_value constructor = nullptr; NAPI_CALL_BASE(env, GetJsConstructorFromGlobal(env, frontendTypeName, &constructor), NAPI_ERR); - NAPI_CALL_BASE(env, napi_new_instance(env, constructor, 0, nullptr, pOut), NAPI_ERR); + NAPI_CALL_BASE(env, napi_new_instance(env, constructor, 1, &refValue, pOut), NAPI_ERR); NAPI_CALL_BASE(env, napi_set_named_property(env, *pOut, PROP_BACKEND_OBJ_REF, refValue), NAPI_ERR); if (bindJsThis) { // bind the jsThis object LOG_D("Bind jsThis"); @@ -249,14 +252,16 @@ namespace OHOS::uitest { NAPI_CALL(env, napi_get_undefined(env, &resultValue)); // return undefined it's error } // notify backend objects deleting - if (g_backendObjsAboutToDelete.size() >= BACKEND_OBJ_CLEAN_THRESHOLD) { + if (g_backendObjsAboutToDelete.size() >= BACKEND_OBJ_GC_BATCH) { auto gcCall = ApiCallInfo {.apiId_ = "BackendObjectsCleaner"}; - auto gcReply = ApiReplyInfo(); - for (auto& ref : g_unCalledJsFuncNames) { - gcCall.paramList_.emplace_back(ref); + unique_lock lock(g_gcQueueMutex); + for (auto count = 0; count < BACKEND_OBJ_GC_BATCH; count++) { + gcCall.paramList_.emplace_back(g_backendObjsAboutToDelete.front()); + g_backendObjsAboutToDelete.pop(); } + lock.unlock(); + auto gcReply = ApiReplyInfo(); transactFunc(gcCall, gcReply); - g_backendObjsAboutToDelete.clear(); } return resultValue; } @@ -390,16 +395,17 @@ namespace OHOS::uitest { descs[idx] = desc; } constexpr auto initializer = [](napi_env env, napi_callback_info info) { + auto argc = NAPI_MAX_ARG_COUNT; + napi_value argv[NAPI_MAX_ARG_COUNT] = { nullptr }; napi_value jsThis = nullptr; - NAPI_CALL_BASE(env, napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr), jsThis); - napi_value refValue = nullptr; - NAPI_CALL_BASE(env, napi_get_named_property(env, jsThis, PROP_BACKEND_OBJ_REF, &refValue), jsThis); - auto ref = make_unique(JsStrToCppStr(env, refValue)); + NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &jsThis, nullptr), jsThis); + auto ref = make_unique(argc <= 0 ? "" : JsStrToCppStr(env, argv[0])); auto finalizer = [](napi_env env, void *data, void *hint) { auto ref = reinterpret_cast(data); if (ref->length() > 0) { LOG_D("Finalizing object: %{public}s", ref->c_str()); - g_backendObjsAboutToDelete.insert(*ref); + unique_lock lock(g_gcQueueMutex); + g_backendObjsAboutToDelete.push(*ref); } delete ref; };