diff --git a/jsapi/worker/worker.cpp b/jsapi/worker/worker.cpp index ecef654d2c6153ca7379be7133da284243780bd7..18fee62c1a9cf0a05d75e9448902e74c15fd9f4d 100644 --- a/jsapi/worker/worker.cpp +++ b/jsapi/worker/worker.cpp @@ -21,7 +21,7 @@ static std::list g_workers; static std::mutex g_workersMutex; Worker::Worker(napi_env env, napi_ref thisVar) - : hostEnv_(env), workerWrapper_(thisVar) + : hostEnv_(env), workerRef_(thisVar) {} void Worker::StartExecuteInThread(napi_env env, const char* script) @@ -224,7 +224,7 @@ void Worker::HostOnErrorInner() } napi_value callback = nullptr; napi_value obj = nullptr; - napi_get_reference_value(hostEnv_, workerWrapper_, &obj); + napi_get_reference_value(hostEnv_, workerRef_, &obj); napi_get_named_property(hostEnv_, obj, "onerror", &callback); bool isCallable = NapiValueHelp::IsCallable(hostEnv_, callback); if (!isCallable) { @@ -307,7 +307,7 @@ void Worker::HostOnMessageInner() } napi_value callback = nullptr; napi_value obj = nullptr; - napi_get_reference_value(hostEnv_, workerWrapper_, &obj); + napi_get_reference_value(hostEnv_, workerRef_, &obj); napi_get_named_property(hostEnv_, obj, "onmessage", &callback); bool isCallable = NapiValueHelp::IsCallable(hostEnv_, callback); @@ -425,7 +425,7 @@ void Worker::HostOnMessageErrorInner() return; } napi_value obj = nullptr; - napi_get_reference_value(hostEnv_, workerWrapper_, &obj); + napi_get_reference_value(hostEnv_, workerRef_, &obj); CallHostFunction(0, nullptr, "onmessageerror"); // handle listeners HandleEventListeners(hostEnv_, obj, 0, nullptr, "messageerror"); @@ -719,9 +719,17 @@ napi_value Worker::WorkerConstructor(napi_env env, napi_callback_info cbinfo) return nullptr; } worker->StartExecuteInThread(env, script); - napi_wrap( - env, thisVar, worker, - [](napi_env env, void* data, void* hint) { + napi_wrap(env, thisVar, worker, [](napi_env env, void* data, void* hint) { + HILOG_ERROR("worker:: thisReference destroy"); + Worker* worker = (Worker*)data; + worker->DeleteWorkerRef(); + }, nullptr, nullptr); + + auto hostEngine = reinterpret_cast(env); + auto thisNativeValue = reinterpret_cast(thisVar); + auto workerRef = hostEngine->CreateReference(thisNativeValue, 1, true, + [](NativeEngine* engine, void* data, void* hint) { + HILOG_ERROR("worker:: workerRef destroy"); Worker* worker = (Worker*)data; { std::lock_guard lock(worker->liveStatusLock_); @@ -740,9 +748,8 @@ napi_value Worker::WorkerConstructor(napi_env env, napi_callback_info cbinfo) } worker->TerminateInner(); } - }, - nullptr, nullptr); - napi_create_reference(env, thisVar, 1, &worker->workerWrapper_); + }, worker, nullptr); + worker->SetWorkerRef(reinterpret_cast(workerRef)); return thisVar; } @@ -954,7 +961,7 @@ napi_value Worker::DispatchEvent(napi_env env, napi_callback_info cbinfo) } napi_value obj = nullptr; - napi_get_reference_value(env, worker->workerWrapper_, &obj); + napi_get_reference_value(env, worker->workerRef_, &obj); napi_value argv[1] = { args[0] }; char* typeStr = NapiValueHelp::GetString(env, typeValue); @@ -1120,7 +1127,7 @@ void Worker::CallHostFunction(size_t argc, const napi_value* argv, const char* m } napi_value callback = nullptr; napi_value obj = nullptr; - napi_get_reference_value(hostEnv_, workerWrapper_, &obj); + napi_get_reference_value(hostEnv_, workerRef_, &obj); napi_get_named_property(hostEnv_, obj, methodName, &callback); bool isCallable = NapiValueHelp::IsCallable(hostEnv_, callback); if (!isCallable) { @@ -1166,14 +1173,14 @@ void Worker::ReleaseHostThreadContent() if (!HostIsStop()) { // 3. set thisVar's nativepointer be null napi_value thisVar = nullptr; - napi_get_reference_value(hostEnv_, workerWrapper_, &thisVar); + napi_get_reference_value(hostEnv_, workerRef_, &thisVar); Worker* worker = nullptr; napi_remove_wrap(hostEnv_, thisVar, (void**)&worker); - // 4. set workerWrapper_ be null - napi_delete_reference(hostEnv_, workerWrapper_); + // 4. set workerRef_ be null + napi_delete_reference(hostEnv_, workerRef_); } hostEnv_ = nullptr; - workerWrapper_ = nullptr; + workerRef_ = nullptr; } napi_value Worker::ParentPortAddEventListener(napi_env env, napi_callback_info cbinfo) diff --git a/jsapi/worker/worker.h b/jsapi/worker/worker.h index 83c86eae7fb4fbcdcb8d857622bacd90c56525f4..7e17fe4ace48da2d6cff65eac84c58cb520f5f45 100644 --- a/jsapi/worker/worker.h +++ b/jsapi/worker/worker.h @@ -207,6 +207,18 @@ public: } } + void DeleteWorkerRef() + { + if (workerRef_ != nullptr && !HostIsStop()) { + napi_delete_reference(hostEnv_, workerRef_); + } + } + + void SetWorkerRef(napi_ref workerRef) + { + workerRef_ = workerRef; + } + private: void WorkerOnMessageInner(); void HostOnMessageInner(); @@ -271,7 +283,7 @@ private: napi_env hostEnv_ {nullptr}; napi_env workerEnv_ {nullptr}; - napi_ref workerWrapper_ {nullptr}; + napi_ref workerRef_ {nullptr}; napi_ref parentPort_ {nullptr}; std::map> eventListeners_ {};