From 8e217e77c1f751e6d0b3f9f1e96b1e8c788a5ea4 Mon Sep 17 00:00:00 2001 From: NathanFreeman <1056159381@qq.com> Date: Wed, 28 Jun 2023 20:59:01 +0800 Subject: [PATCH 1/2] Fix bug #5080 --- ext-src/php_swoole.cc | 2 +- include/swoole_signal.h | 2 +- package.xml | 4 ++++ src/core/base.cc | 2 +- src/coroutine/thread_context.cc | 2 ++ src/os/signal.cc | 12 ++++++------ 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ext-src/php_swoole.cc b/ext-src/php_swoole.cc index a2b388d51e7..062a9a1236b 100644 --- a/ext-src/php_swoole.cc +++ b/ext-src/php_swoole.cc @@ -826,7 +826,7 @@ PHP_MINFO_FUNCTION(swoole) { #ifdef HAVE_KQUEUE php_info_print_table_row(2, "kqueue", "enabled"); #endif -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) php_info_print_table_row(2, "signalfd", "enabled"); #endif #ifdef SW_USE_ACCEPT4 diff --git a/include/swoole_signal.h b/include/swoole_signal.h index f20a056e8b8..5d4664dfef7 100644 --- a/include/swoole_signal.h +++ b/include/swoole_signal.h @@ -32,7 +32,7 @@ struct Signal { typedef swoole::SignalHandler swSignalHandler; -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) void swoole_signalfd_init(); #endif diff --git a/package.xml b/package.xml index 13223871b59..d472421f91c 100644 --- a/package.xml +++ b/package.xml @@ -2415,5 +2415,9 @@ + + + + diff --git a/src/core/base.cc b/src/core/base.cc index 37b723a6dc6..baa8a3d6220 100644 --- a/src/core/base.cc +++ b/src/core/base.cc @@ -204,7 +204,7 @@ void swoole_init(void) { } // init signalfd -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) swoole_signalfd_init(); SwooleG.enable_signalfd = 1; #endif diff --git a/src/coroutine/thread_context.cc b/src/coroutine/thread_context.cc index 46b4cc1fe7e..8dc232249bf 100644 --- a/src/coroutine/thread_context.cc +++ b/src/coroutine/thread_context.cc @@ -16,6 +16,7 @@ #include "swoole_api.h" #include "swoole_async.h" +#include "swoole_signal.h" #include "swoole_coroutine_context.h" #ifdef SW_USE_THREAD_CONTEXT @@ -88,6 +89,7 @@ bool Context::swap_out() { } void Context::context_func(void *arg) { + swoole_signal_block_all(); Context *_this = (Context *) arg; SwooleTG.reactor = g_reactor; SwooleTG.timer = g_timer; diff --git a/src/os/signal.cc b/src/os/signal.cc index 86d1b26da5a..5d13b37b279 100644 --- a/src/os/signal.cc +++ b/src/os/signal.cc @@ -20,7 +20,7 @@ #include "swoole_socket.h" #include "swoole_reactor.h" -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) #include #endif @@ -41,7 +41,7 @@ using swoole::Signal; using swoole::SignalHandler; using swoole::network::Socket; -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) static SignalHandler swoole_signalfd_set(int signo, SignalHandler handler); static bool swoole_signalfd_create(); static bool swoole_signalfd_setup(Reactor *reactor); @@ -55,7 +55,7 @@ static SignalHandler swoole_signal_kqueue_set(int signo, SignalHandler handler); static void swoole_signal_async_handler(int signo); -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) static sigset_t signalfd_mask; static int signal_fd = -1; static pid_t signalfd_create_pid; @@ -126,7 +126,7 @@ SignalHandler swoole_signal_set(int signo, SignalHandler func, int restart, int * set new signal handler and return origin signal handler */ SignalHandler swoole_signal_set(int signo, SignalHandler handler) { -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) if (SwooleG.enable_signalfd && swoole_event_is_available()) { return swoole_signalfd_set(signo, handler); } else @@ -187,7 +187,7 @@ SignalHandler swoole_signal_get_handler(int signo) { } void swoole_signal_clear(void) { -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) if (SwooleG.enable_signalfd && swoole_signalfd_is_available()) { swoole_signalfd_clear(); } else @@ -209,7 +209,7 @@ void swoole_signal_clear(void) { sw_memset_zero(&signals, sizeof(signals)); } -#ifdef HAVE_SIGNALFD +#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) void swoole_signalfd_init() { sigemptyset(&signalfd_mask); sw_memset_zero(&signals, sizeof(signals)); From aba47217d7fa021503ad0d1f368307ed2ea8bafa Mon Sep 17 00:00:00 2001 From: MARiA so cute <33935209+NathanFreeman@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:40:52 +0800 Subject: [PATCH 2/2] fix error --- ext-src/php_swoole.cc | 2 +- ext-src/swoole_process.cc | 12 ++++++++++++ include/swoole_signal.h | 2 +- src/core/base.cc | 2 +- src/os/signal.cc | 12 ++++++------ 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/ext-src/php_swoole.cc b/ext-src/php_swoole.cc index 062a9a1236b..a2b388d51e7 100644 --- a/ext-src/php_swoole.cc +++ b/ext-src/php_swoole.cc @@ -826,7 +826,7 @@ PHP_MINFO_FUNCTION(swoole) { #ifdef HAVE_KQUEUE php_info_print_table_row(2, "kqueue", "enabled"); #endif -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD php_info_print_table_row(2, "signalfd", "enabled"); #endif #ifdef SW_USE_ACCEPT4 diff --git a/ext-src/swoole_process.cc b/ext-src/swoole_process.cc index 0195af9eb25..b3fd2cbbabb 100644 --- a/ext-src/swoole_process.cc +++ b/ext-src/swoole_process.cc @@ -454,7 +454,11 @@ static PHP_METHOD(swoole_process, signal) { if (zcallback == nullptr) { fci_cache = signal_fci_caches[signo]; if (fci_cache) { +#ifdef SW_USE_THREAD_CONTEXT + swoole_event_defer([signo](void *) { swoole_signal_set(signo, nullptr); }, nullptr); +#else swoole_signal_set(signo, nullptr); +#endif signal_fci_caches[signo] = nullptr; swoole_event_defer(sw_zend_fci_cache_free, fci_cache); SwooleTG.signal_listener_num--; @@ -486,7 +490,11 @@ static PHP_METHOD(swoole_process, signal) { SwooleTG.signal_listener_num++; } signal_fci_caches[signo] = fci_cache; +#ifdef SW_USE_THREAD_CONTEXT + swoole_event_defer([signo, handler](void *) { swoole_signal_set(signo, handler); }, nullptr); +#else swoole_signal_set(signo, handler); +#endif RETURN_TRUE; } @@ -506,7 +514,11 @@ static PHP_METHOD(swoole_process, signal) { } signal_fci_caches[signo] = fci_cache; +#ifdef SW_USE_THREAD_CONTEXT + swoole_event_defer([signo, handler](void *) { swoole_signal_set(signo, handler); }, nullptr); +#else swoole_signal_set(signo, handler); +#endif RETURN_TRUE; } diff --git a/include/swoole_signal.h b/include/swoole_signal.h index 5d4664dfef7..f20a056e8b8 100644 --- a/include/swoole_signal.h +++ b/include/swoole_signal.h @@ -32,7 +32,7 @@ struct Signal { typedef swoole::SignalHandler swSignalHandler; -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD void swoole_signalfd_init(); #endif diff --git a/src/core/base.cc b/src/core/base.cc index baa8a3d6220..37b723a6dc6 100644 --- a/src/core/base.cc +++ b/src/core/base.cc @@ -204,7 +204,7 @@ void swoole_init(void) { } // init signalfd -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD swoole_signalfd_init(); SwooleG.enable_signalfd = 1; #endif diff --git a/src/os/signal.cc b/src/os/signal.cc index 5d13b37b279..86d1b26da5a 100644 --- a/src/os/signal.cc +++ b/src/os/signal.cc @@ -20,7 +20,7 @@ #include "swoole_socket.h" #include "swoole_reactor.h" -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD #include #endif @@ -41,7 +41,7 @@ using swoole::Signal; using swoole::SignalHandler; using swoole::network::Socket; -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD static SignalHandler swoole_signalfd_set(int signo, SignalHandler handler); static bool swoole_signalfd_create(); static bool swoole_signalfd_setup(Reactor *reactor); @@ -55,7 +55,7 @@ static SignalHandler swoole_signal_kqueue_set(int signo, SignalHandler handler); static void swoole_signal_async_handler(int signo); -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD static sigset_t signalfd_mask; static int signal_fd = -1; static pid_t signalfd_create_pid; @@ -126,7 +126,7 @@ SignalHandler swoole_signal_set(int signo, SignalHandler func, int restart, int * set new signal handler and return origin signal handler */ SignalHandler swoole_signal_set(int signo, SignalHandler handler) { -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD if (SwooleG.enable_signalfd && swoole_event_is_available()) { return swoole_signalfd_set(signo, handler); } else @@ -187,7 +187,7 @@ SignalHandler swoole_signal_get_handler(int signo) { } void swoole_signal_clear(void) { -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD if (SwooleG.enable_signalfd && swoole_signalfd_is_available()) { swoole_signalfd_clear(); } else @@ -209,7 +209,7 @@ void swoole_signal_clear(void) { sw_memset_zero(&signals, sizeof(signals)); } -#if defined(HAVE_SIGNALFD) && !defined(SW_USE_THREAD_CONTEXT) +#ifdef HAVE_SIGNALFD void swoole_signalfd_init() { sigemptyset(&signalfd_mask); sw_memset_zero(&signals, sizeof(signals));