diff --git a/js_concurrent_module/worker/worker.h b/js_concurrent_module/worker/worker.h index 4005bf775f0bc7a4bb8ff4812259c8c9178d2ccf..87486b174c13b68a368b48d48d1cc8c2f9378dd8 100644 --- a/js_concurrent_module/worker/worker.h +++ b/js_concurrent_module/worker/worker.h @@ -453,8 +453,12 @@ public: { workerEnv_ = workerEnv; std::unique_lock lock(workerEnvCallbackQueueMutex_); - for (; !workerEnvCallbackQueue_.empty(); workerEnvCallbackQueue_.pop()) { - workerEnvCallbackQueue_.front()(workerEnv_); + while (!workerEnvCallbackQueue_.empty()) { + auto callback = workerEnvCallbackQueue_.front(); + workerEnvCallbackQueue_.pop(); + lock.unlock(); + callback(workerEnv_); + lock.lock(); } } @@ -497,13 +501,21 @@ public: } } - void RegisterCallbackForWorkerEnv(std::function callback) + void RegisterCallbackForWorkerEnv(std::function callback) { - std::unique_lock lock(workerEnvCallbackQueueMutex_); - workerEnvCallbackQueue_.push(callback); + { + std::unique_lock lock(workerEnvCallbackQueueMutex_); + workerEnvCallbackQueue_.push(callback); + } + if (workerEnv_ != nullptr) { - for (; !workerEnvCallbackQueue_.empty(); workerEnvCallbackQueue_.pop()) { - workerEnvCallbackQueue_.front()(workerEnv_); + std::unique_lock lock(workerEnvCallbackQueueMutex_); + while (!workerEnvCallbackQueue_.empty()) { + auto callback = workerEnvCallbackQueue_.front(); + workerEnvCallbackQueue_.pop(); + lock.unlock(); + callback(workerEnv_); + lock.lock(); } } }