From 2d199e4a727eaa99ed14817154c2b9cb4f536ff0 Mon Sep 17 00:00:00 2001 From: yongyuan Date: Fri, 29 Nov 2024 00:02:59 +0800 Subject: [PATCH 1/4] cherry pick 60479bd from https://gitee.com/fu-yongyong/third_party_libuv/pulls/215 commit Signed-off-by: yongyuan --- src/unix/loop.c | 31 ++++++++++++++++++++++++++++++- src/unix/signal.c | 7 +++++++ src/uv-common.h | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/unix/loop.c b/src/unix/loop.c index 2cb896a..71c465d 100644 --- a/src/unix/loop.c +++ b/src/unix/loop.c @@ -28,6 +28,33 @@ #include #include +#ifdef USE_FFRT +#include +#include + +static void uv__get_process_name(char* processName, int bufferLength) { + int fd = open("/proc/self/cmdline", O_RDONLY); + if (fd != -1) { + ssize_t ret = syscall(SYS_read, fd, processName, bufferLength - 1); + if (ret != -1) { + processName[ret] = '\0'; + } + syscall(SYS_close, fd); + } +} + +static void uv__set_signal_flag(uv__loop_internal_fields_t* lfields) { + char processName[1024] = {0}; + uv__get_process_name(processName, sizeof(processName)); + char* c = strstr(processName, "com.atomicservice."); + if (c == NULL || c > processName) { + lfields->trigger = 0; + return; + } + lfields->trigger = 1; +} +#endif + int uv_loop_init(uv_loop_t* loop) { uv__loop_internal_fields_t* lfields; void* saved_data; @@ -42,7 +69,9 @@ int uv_loop_init(uv_loop_t* loop) { if (lfields == NULL) return UV_ENOMEM; loop->internal_fields = lfields; - +#ifdef USE_FFRT + uv__set_signal_flag(lfields); +#endif err = uv_mutex_init(&lfields->loop_metrics.lock); if (err) goto fail_metrics_mutex_init; diff --git a/src/unix/signal.c b/src/unix/signal.c index 3e5e303..cc15b26 100644 --- a/src/unix/signal.c +++ b/src/unix/signal.c @@ -507,7 +507,14 @@ static void uv__signal_event(uv_loop_t* loop, if (msg->signum == handle->signum) { assert(!(handle->flags & UV_HANDLE_CLOSING)); +#ifdef USE_FFRT + uv__loop_internal_fields_t* lfields = uv__get_internal_fields(handle->loop); + if (lfields->trigger != 1) { + handle->signal_cb(handle, handle->signum); + } +#else handle->signal_cb(handle, handle->signum); +#endif } handle->dispatched_signals++; diff --git a/src/uv-common.h b/src/uv-common.h index bc2e300..4a22af7 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -449,6 +449,7 @@ struct uv__loop_internal_fields_s { #endif /* __linux__ */ #ifdef USE_FFRT struct uv__queue wq_sub[4]; + unsigned int trigger; #endif }; -- Gitee From f7181be529b35acc94491f0ab0f4b33ebfda4b9f Mon Sep 17 00:00:00 2001 From: Forever Date: Sun, 1 Dec 2024 10:13:22 +0000 Subject: [PATCH 2/4] update src/unix/loop.c. Signed-off-by: Forever --- src/unix/loop.c | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/unix/loop.c b/src/unix/loop.c index 71c465d..295d572 100644 --- a/src/unix/loop.c +++ b/src/unix/loop.c @@ -28,33 +28,6 @@ #include #include -#ifdef USE_FFRT -#include -#include - -static void uv__get_process_name(char* processName, int bufferLength) { - int fd = open("/proc/self/cmdline", O_RDONLY); - if (fd != -1) { - ssize_t ret = syscall(SYS_read, fd, processName, bufferLength - 1); - if (ret != -1) { - processName[ret] = '\0'; - } - syscall(SYS_close, fd); - } -} - -static void uv__set_signal_flag(uv__loop_internal_fields_t* lfields) { - char processName[1024] = {0}; - uv__get_process_name(processName, sizeof(processName)); - char* c = strstr(processName, "com.atomicservice."); - if (c == NULL || c > processName) { - lfields->trigger = 0; - return; - } - lfields->trigger = 1; -} -#endif - int uv_loop_init(uv_loop_t* loop) { uv__loop_internal_fields_t* lfields; void* saved_data; @@ -69,9 +42,6 @@ int uv_loop_init(uv_loop_t* loop) { if (lfields == NULL) return UV_ENOMEM; loop->internal_fields = lfields; -#ifdef USE_FFRT - uv__set_signal_flag(lfields); -#endif err = uv_mutex_init(&lfields->loop_metrics.lock); if (err) goto fail_metrics_mutex_init; -- Gitee From 0ee15720316a0da5fc7d61c7b1c24262a806818f Mon Sep 17 00:00:00 2001 From: Forever Date: Sun, 1 Dec 2024 10:15:09 +0000 Subject: [PATCH 3/4] update src/unix/signal.c. Signed-off-by: Forever --- src/unix/signal.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/unix/signal.c b/src/unix/signal.c index cc15b26..ad3b57f 100644 --- a/src/unix/signal.c +++ b/src/unix/signal.c @@ -23,6 +23,8 @@ #include "uv_log.h" #ifdef USE_FFRT #include "ffrt_inner.h" +#include +#include #endif #include #include @@ -456,6 +458,36 @@ static int uv__signal_start(uv_signal_t* handle, } +#ifdef USE_FFRT +static void uv__get_process_name(char* processName, int bufferLength) { + int fd = open("/proc/self/cmdline", O_RDONLY); + if (fd != -1) { + ssize_t ret = syscall(SYS_read, fd, processName, bufferLength - 1); + if (ret != -1) { + processName[ret] = '\0'; + } + syscall(SYS_close, fd); + } +} + + +static void uv__set_signal_flag(uv__loop_internal_fields_t* lfields) { + static int trigger = -1; + if (trigger == -1) { + char processName[1024] = {0}; + uv__get_process_name(processName, sizeof(processName)); + char* c = strstr(processName, "com.atomicservice."); + if (c == NULL || c > processName) { + trigger = 0; + } else { + trigger = 1; + } + } + lfields->trigger = (unsigned int)trigger; +} +#endif + + static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events) { @@ -467,7 +499,9 @@ static void uv__signal_event(uv_loop_t* loop, bytes = 0; end = 0; - +#ifdef USE_FFRT + uv__set_signal_flag(loop->internal_fields); +#endif do { r = read(loop->signal_pipefd[0], buf + bytes, sizeof(buf) - bytes); -- Gitee From d8329418916ae0d05b7242240ba8f889c363009a Mon Sep 17 00:00:00 2001 From: Forever Date: Sun, 1 Dec 2024 10:18:57 +0000 Subject: [PATCH 4/4] update src/unix/loop.c. Signed-off-by: Forever --- src/unix/loop.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/unix/loop.c b/src/unix/loop.c index 295d572..2cb896a 100644 --- a/src/unix/loop.c +++ b/src/unix/loop.c @@ -42,6 +42,7 @@ int uv_loop_init(uv_loop_t* loop) { if (lfields == NULL) return UV_ENOMEM; loop->internal_fields = lfields; + err = uv_mutex_init(&lfields->loop_metrics.lock); if (err) goto fail_metrics_mutex_init; -- Gitee