From 18ad98b8cb1c3d45def2fc01a9565a927e8ba7c3 Mon Sep 17 00:00:00 2001 From: liaoxingbin Date: Wed, 23 Apr 2025 11:11:35 +0800 Subject: [PATCH] promote qos Signed-off-by: liaoxingbin --- include/uv.h | 3 ++- src/threadpool.c | 22 +++++++++++++++++----- src/unix/loop.c | 1 + src/uv-common.h | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/include/uv.h b/include/uv.h index 8c6631d..caac1ba 100644 --- a/include/uv.h +++ b/include/uv.h @@ -1194,7 +1194,8 @@ typedef enum { uv_qos_utility = 1, uv_qos_default = 2, uv_qos_user_initiated = 3, - uv_qos_user_interactive = 4, + uv_qos_reserved = 4, /* Do not use this qos, reserved for now. */ + uv_qos_user_interactive = 5, } uv_qos_t; UV_EXTERN int uv_queue_work_with_qos(uv_loop_t* loop, diff --git a/src/threadpool.c b/src/threadpool.c index 553800d..2196220 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -503,7 +503,11 @@ void uv__work_done(uv_async_t* handle) { uv__loop_internal_fields_t* lfields = uv__get_internal_fields(loop); int i; uv__queue_init(&wq); - for (i = 4; i >= 0; i--) { + for (i = 5; i >= 0; i--) { + // No task in 4-th lfields->wq_sub queue. + if (i == 4) { + continue; + } if (!uv__queue_empty(&lfields->wq_sub[i])) { uv__queue_append(&lfields->wq_sub[i], &wq); } @@ -740,8 +744,12 @@ int uv_queue_work_with_qos(uv_loop_t* loop, STATIC_ASSERT(uv_qos_utility == ffrt_qos_utility); STATIC_ASSERT(uv_qos_default == ffrt_qos_default); STATIC_ASSERT(uv_qos_user_initiated == ffrt_qos_user_initiated); - STATIC_ASSERT(uv_qos_user_interactive == ffrt_qos_deadline_request); - if (qos < ffrt_qos_background || qos > ffrt_qos_deadline_request) { + STATIC_ASSERT(uv_qos_user_interactive == ffrt_qos_user_interactive); + if (qos == uv_qos_reserved) { + UV_LOGW("Invaild qos %{public}d", (int)qos); + return UV_EINVAL; + } + if (qos < ffrt_qos_background || qos > ffrt_qos_user_interactive) { return UV_EINVAL; } @@ -787,8 +795,12 @@ int uv_queue_work_with_qos_internal(uv_loop_t* loop, STATIC_ASSERT(uv_qos_utility == ffrt_qos_utility); STATIC_ASSERT(uv_qos_default == ffrt_qos_default); STATIC_ASSERT(uv_qos_user_initiated == ffrt_qos_user_initiated); - STATIC_ASSERT(uv_qos_user_interactive == ffrt_qos_deadline_request); - if (qos < ffrt_qos_background || qos > ffrt_qos_deadline_request) { + STATIC_ASSERT(uv_qos_user_interactive == ffrt_qos_user_interactive); + if (qos == uv_qos_reserved) { + UV_LOGW("Invaild qos %{public}d", (int)qos); + return UV_EINVAL; + } + if (qos < ffrt_qos_background || qos > ffrt_qos_user_interactive) { return UV_EINVAL; } diff --git a/src/unix/loop.c b/src/unix/loop.c index 845f20d..a24c442 100644 --- a/src/unix/loop.c +++ b/src/unix/loop.c @@ -57,6 +57,7 @@ int uv_loop_init(uv_loop_t* loop) { uv__queue_init(&(lfields_qos->wq_sub[uv_qos_utility])); uv__queue_init(&(lfields_qos->wq_sub[uv_qos_default])); uv__queue_init(&(lfields_qos->wq_sub[uv_qos_user_initiated])); + uv__queue_init(&(lfields_qos->wq_sub[uv_qos_reserved])); uv__queue_init(&(lfields_qos->wq_sub[uv_qos_user_interactive])); #endif diff --git a/src/uv-common.h b/src/uv-common.h index 0bc5238..bd93089 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -455,7 +455,7 @@ struct uv__loop_internal_fields_s { void* inv; /* used by uv__platform_invalidate_fd() */ #endif /* __linux__ */ #ifdef USE_FFRT - struct uv__queue wq_sub[5]; + struct uv__queue wq_sub[6]; #endif #if defined(USE_OHOS_DFX) && defined(__aarch64__) unsigned int thread_id; -- Gitee