summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2020-04-28 14:25:42 +0400
committerDaniel Black <daniel@mariadb.org>2020-10-25 10:27:26 +1100
commitacc7121f66ec9ccc9cd77f934f2e8ba990e98e3a (patch)
tree7687a62b9be8f1a76ab2257cfbf761f646aff2c4
parent5e43c6f3b3e158da8765c5463928f12460c4e5bf (diff)
downloadmariadb-git-bb-10.5-danielblack-MDEV-20178-pr1515.tar.gz
MDEV-19508 - Issue with: #define SI_KERNELbb-10.5-danielblack-MDEV-20178-pr1515
Reverted 07e9b1389, use setsid() instead. Conventional use of SIGHUP to dump daemon information or flush caches assumes preceeding setsid() call. Ideally we should not setup SIGHUP handler in bootstrap and (probably) debug_gdb modes. Additional information on SysV style and systemd style daemons: https://www.freedesktop.org/software/systemd/man/daemon.html closes #1392
-rw-r--r--cmake/os/WindowsCache.cmake1
-rw-r--r--config.h.cmake1
-rw-r--r--configure.cmake1
-rw-r--r--include/my_pthread.h14
-rw-r--r--mysys/thr_alarm.c3
-rw-r--r--sql/mysqld.cc10
6 files changed, 9 insertions, 21 deletions
diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake
index 4d3b2af575e..ab40f752902 100644
--- a/cmake/os/WindowsCache.cmake
+++ b/cmake/os/WindowsCache.cmake
@@ -151,7 +151,6 @@ SET(HAVE_SIGSET CACHE INTERNAL "")
SET(HAVE_SIGTERM 1 CACHE INTERNAL "")
SET(HAVE_SIGTHREADMASK CACHE INTERNAL "")
SET(HAVE_SIGWAIT CACHE INTERNAL "")
-SET(HAVE_SIGWAITINFO CACHE INTERNAL "")
SET(HAVE_SIZEOF_CHARP TRUE CACHE INTERNAL "")
SET(SIZEOF_CHARP ${CMAKE_SIZEOF_VOID_P} CACHE INTERNAL "")
SET(HAVE_SIZEOF_IN6_ADDR TRUE CACHE INTERNAL "")
diff --git a/config.h.cmake b/config.h.cmake
index 5a48df0a135..e47974af4ae 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -210,7 +210,6 @@
#cmakedefine HAVE_SIGACTION 1
#cmakedefine HAVE_SIGTHREADMASK 1
#cmakedefine HAVE_SIGWAIT 1
-#cmakedefine HAVE_SIGWAITINFO 1
#cmakedefine HAVE_SLEEP 1
#cmakedefine HAVE_SNPRINTF 1
#cmakedefine HAVE_STPCPY 1
diff --git a/configure.cmake b/configure.cmake
index 8533b8ee0b2..dbc04eb1561 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -397,7 +397,6 @@ CHECK_FUNCTION_EXISTS (setlocale HAVE_SETLOCALE)
CHECK_FUNCTION_EXISTS (sigaction HAVE_SIGACTION)
CHECK_FUNCTION_EXISTS (sigthreadmask HAVE_SIGTHREADMASK)
CHECK_FUNCTION_EXISTS (sigwait HAVE_SIGWAIT)
-CHECK_FUNCTION_EXISTS (sigwaitinfo HAVE_SIGWAITINFO)
CHECK_FUNCTION_EXISTS (sigset HAVE_SIGSET)
CHECK_FUNCTION_EXISTS (sleep HAVE_SLEEP)
CHECK_FUNCTION_EXISTS (snprintf HAVE_SNPRINTF)
diff --git a/include/my_pthread.h b/include/my_pthread.h
index 66876032178..3ecc851ca80 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -189,19 +189,7 @@ extern int my_pthread_create_detached;
int sigwait(sigset_t *set, int *sig);
#endif
-static inline int my_sigwait(sigset_t *set, int *sig, int *code)
-{
-#ifdef HAVE_SIGWAITINFO
- siginfo_t siginfo;
- *sig= sigwaitinfo(set, &siginfo);
- *code= siginfo.si_code;
- return *sig < 0 ? errno : 0;
-#else
-#define SI_KERNEL 128
- *code= 0;
- return sigwait(set, sig);
-#endif
-}
+#define my_sigwait(A,B) sigwait((A),(B))
#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK)
#define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C))
diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c
index 92a471075c6..2cdcd5a28b1 100644
--- a/mysys/thr_alarm.c
+++ b/mysys/thr_alarm.c
@@ -707,8 +707,7 @@ static void *signal_hand(void *arg __attribute__((unused)))
DBUG_PRINT("info",("Starting signal and alarm handling thread"));
for(;;)
{
- int code;
- while ((error=my_sigwait(&set,&sig,&code)) == EINTR)
+ while ((error= my_sigwait(&set, &sig)) == EINTR)
printf("sigwait restarted\n");
if (error)
{
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 9834d331474..32f6db243d7 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2819,6 +2819,11 @@ void init_signals(void)
struct sigaction sa;
DBUG_ENTER("init_signals");
+ /*
+ No need to check return value, it is expected to fail only if we're session
+ leader already (e.g. under systemd).
+ */
+ setsid();
my_sigset(THR_SERVER_ALARM,print_signal_warning); // Should never be called!
if (opt_stack_trace || (test_flags & TEST_CORE_ON_SIGNAL))
@@ -2983,9 +2988,8 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused)))
for (;;)
{
int error;
- int origin;
- while ((error= my_sigwait(&set, &sig, &origin)) == EINTR) /* no-op */;
+ while ((error= my_sigwait(&set, &sig)) == EINTR) /* no-op */;
if (cleanup_done)
{
DBUG_PRINT("quit",("signal_handler: calling my_thread_end()"));
@@ -3025,7 +3029,7 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused)))
}
break;
case SIGHUP:
- if (!abort_loop && origin != SI_KERNEL)
+ if (!abort_loop)
{
int not_used;
mysql_print_status(); // Print some debug info