From 91977964d0e5948c2ba48e68794d3191f3c7e769 Mon Sep 17 00:00:00 2001 From: liaoxingxing Date: Mon, 30 Sep 2024 09:51:22 +0800 Subject: [PATCH] threadpool modify Signed-off-by: liaoxingxing --- src/threadpool.c | 35 +++++++++++++++++++++++++---------- src/uv-common.c | 2 ++ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/threadpool.c b/src/threadpool.c index edd724f..b6cbd87 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -42,6 +42,11 @@ #define MAX_THREADPOOL_SIZE 1024 #define UV_TRACE_NAME "UV_TRACE" +#ifdef USE_OHOS_DFX +#define MIN_REQS_THRESHOLD 50 +#define MAX_REQS_THRESHOLD 500 +#endif + static uv_rwlock_t g_closed_uv_loop_rwlock; static uv_once_t once = UV_ONCE_INIT; static uv_cond_t cond; @@ -762,24 +767,19 @@ void uv__ffrt_work(ffrt_executor_task_t* data, ffrt_qos_t qos) #ifdef UV_STATISTIC uv__post_statistic_work(w, WORK_EXECUTING); #endif - uv_work_t* req = container_of(w, uv_work_t, work_req); #ifdef ASYNC_STACKTRACE + uv_work_t* req = container_of(w, uv_work_t, work_req); LibuvSetStackId((uint64_t)req->reserved[3]); #endif w->work(w); #ifdef UV_STATISTIC uv__post_statistic_work(w, WORK_END); #endif - uv__loop_internal_fields_t* lfields = uv__get_internal_fields(loop); rdlock_closed_uv_loop_rwlock(); - if (loop->magic != UV_LOOP_MAGIC - || !lfields - || qos >= ARRAY_SIZE(lfields->wq_sub) - || !lfields->wq_sub[qos].next - || !lfields->wq_sub[qos].prev) { + if (loop->magic != UV_LOOP_MAGIC) { rdunlock_closed_uv_loop_rwlock(); - UV_LOGE("uv_loop(%{public}zu:%{public}#x) in task(%p:%p) is invalid", - (size_t)loop, loop->magic, req->work_cb, req->after_work_cb); + UV_LOGE("uv_loop(%{public}zu:%{public}#x), task is invalid", + (size_t)loop, loop->magic); return; } @@ -792,6 +792,7 @@ void uv__ffrt_work(ffrt_executor_task_t* data, ffrt_qos_t qos) (UV_EVENT_MAGIC_OFFSET << UV_EVENT_MAGIC_OFFSETBITS)); 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_async_send(&loop->wq_async); } @@ -871,13 +872,26 @@ void uv__work_submit_with_qos(uv_loop_t* loop, #endif +static void uv__print_active_reqs(uv_loop_t* loop) { +#ifdef USE_OHOS_DFX + unsigned int count = loop->active_reqs.count; + if (count == MIN_REQS_THRESHOLD || count == MIN_REQS_THRESHOLD + 1 || + count == MAX_REQS_THRESHOLD || count == MAX_REQS_THRESHOLD + 1) { + UV_LOGW("active reqs:%{public}u", count); + } +#else + return; +#endif +} + + int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb) { if (work_cb == NULL) return UV_EINVAL; - + uv__print_active_reqs(loop); uv__req_init(loop, req, UV_WORK); req->loop = loop; req->work_cb = work_cb; @@ -930,6 +944,7 @@ int uv_queue_work_with_qos(uv_loop_t* loop, return UV_EINVAL; } + uv__print_active_reqs(loop); uv__req_init(loop, req, UV_WORK); req->loop = loop; req->work_cb = work_cb; diff --git a/src/uv-common.c b/src/uv-common.c index c766d09..ed8aff4 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -538,6 +538,8 @@ void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) { struct uv__queue* q; uv_handle_t* h; + UV_LOGI("clean up handles in loop(%{public}zu)", (size_t)loop); + uv__queue_move(&loop->handle_queue, &queue); while (!uv__queue_empty(&queue)) { q = uv__queue_head(&queue); -- Gitee