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));