diff --git a/src/threadpool.c b/src/threadpool.c index 3f058d77228728fce0b41db496709738ae95eb67..47f96bdc8731eb3eafed61a1296b7038d103003b 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -809,13 +809,14 @@ void uv__ffrt_work(ffrt_executor_task_t* data, ffrt_qos_t qos) int status = (w->work == uv__cancelled) ? UV_ECANCELED : 0; struct uv_loop_data* addr = (struct uv_loop_data*)((uint64_t)loop->data - (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); + uv_mutex_unlock(&loop->wq_mutex); addr->post_task_func(addr->event_handler, uv__task_done_wrapper, (void*)w, status, qos); } else { uv__loop_internal_fields_t* lfields = uv__get_internal_fields(loop); uv__queue_insert_tail(&(lfields->wq_sub[qos]), &w->wq); + uv_mutex_unlock(&loop->wq_mutex); uv_async_send(&loop->wq_async); } - uv_mutex_unlock(&loop->wq_mutex); rdunlock_closed_uv_loop_rwlock(); }