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-15 18:42:31 +1100
commit9bd9c56d77e7799507796d270b55e9f6519c396c (patch)
tree03bc29a5bd0ee5e885c285e29b68be28ba18b745
parenta6f956488c712bef3b13660584d1b905e0c676cc (diff)
downloadmariadb-git-bb-10.4-svoj.tar.gz
MDEV-19508 - Issue with: #define SI_KERNELbb-10.4-svoj
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
-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 149fdad231f..a9b01844443 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 652ea683ce4..dc954faf850 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -215,7 +215,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 b31c9e48388..6a511cb9381 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -400,7 +400,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 81dd63ee331..5e0c79c2142 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 553dc55bfc3..47b3205f608 100644
--- a/mysys/thr_alarm.c
+++ b/mysys/thr_alarm.c
@@ -731,8 +731,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 26012f317f9..fe47c4406ad 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3081,6 +3081,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))
@@ -3246,9 +3251,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()"));
@@ -3288,7 +3292,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