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/package.xml b/package.xml
index 13223871b59..d472421f91c 100644
--- a/package.xml
+++ b/package.xml
@@ -2415,5 +2415,9 @@
+
+
+
+
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;