diff --git a/include/uv.h b/include/uv.h index 0d39684b8e71dca3ea92a16321fa7e480a295c0a..554629840ad01e6a67e58a7b146ba58fcaca80cf 100644 --- a/include/uv.h +++ b/include/uv.h @@ -1187,7 +1187,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 ee86f7b1340f8bf93ff472f74b92dc445bab9f82..4d1675edc5631d5c66a7356c94a69e52e1ac4f96 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -693,7 +693,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 = uv_qos_user_interactive; i >= 0; i--) { + // No task in 4-th lfields->wq_sub queue. + if (i == uv_qos_reserved) { + continue; + } if (!uv__queue_empty(&lfields->wq_sub[i])) { uv__queue_append(&lfields->wq_sub[i], &wq); } @@ -940,8 +944,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; } diff --git a/src/unix/loop.c b/src/unix/loop.c index 2a304081e7a78092f688f00cb6f947ebfe05920a..32206a2c944c6a7b3e9ba2b28b24ebe8c4485b0f 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 ac0bbb9ad1729493589479cf0cb0a1645193808c..25b90119b8f2c781a9194c32c192621f4eef50f5 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -41,6 +41,10 @@ # include #endif +#ifdef USE_FFRT +#define WQ_SUB_QUEUE_LEN 6 +#endif + #if defined(USE_OHOS_DFX) && defined(__aarch64__) #define MULTI_THREAD_CHECK_LOOP_INIT 0x80000000 #endif @@ -451,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[WQ_SUB_QUEUE_LEN]; #endif #if defined(USE_OHOS_DFX) && defined(__aarch64__) unsigned int thread_id;