diff options
-rw-r--r-- | cmake/os/WindowsCache.cmake | 1 | ||||
-rw-r--r-- | config.h.cmake | 1 | ||||
-rw-r--r-- | configure.cmake | 1 | ||||
-rw-r--r-- | include/my_pthread.h | 14 | ||||
-rw-r--r-- | mysys/thr_alarm.c | 6 | ||||
-rw-r--r-- | sql/mysqld.cc | 7 |
6 files changed, 23 insertions, 7 deletions
diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake index 2ba3aec16b4..f51015e436c 100644 --- a/cmake/os/WindowsCache.cmake +++ b/cmake/os/WindowsCache.cmake @@ -153,6 +153,7 @@ 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 3974c2a3618..247d983c501 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -219,6 +219,7 @@ #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 42ba2496105..08eac106e6a 100644 --- a/configure.cmake +++ b/configure.cmake @@ -400,6 +400,7 @@ 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 2712c7d8ffd..843701ccab9 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -189,7 +189,19 @@ extern int my_pthread_create_detached; int sigwait(sigset_t *set, int *sig); #endif -#define my_sigwait(A,B) sigwait((A),(B)) +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 +} #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 357923cf388..09c4984c069 100644 --- a/mysys/thr_alarm.c +++ b/mysys/thr_alarm.c @@ -731,7 +731,8 @@ static void *signal_hand(void *arg __attribute__((unused))) DBUG_PRINT("info",("Starting signal and alarm handling thread")); for(;;) { - while ((error=my_sigwait(&set,&sig)) == EINTR) + int code; + while ((error=my_sigwait(&set,&sig,&code)) == EINTR) printf("sigwait restarted\n"); if (error) { @@ -805,8 +806,7 @@ int main(int argc __attribute__((unused)),char **argv __attribute__((unused))) /* Start signal thread and wait for it to start */ mysql_mutex_lock(&LOCK_thread_count); - mysql_thread_create(0, - &tid, &thr_attr, signal_hand, NULL); + mysql_thread_create(0, &tid, &thr_attr, signal_hand, NULL); mysql_cond_wait(&COND_thread_count, &LOCK_thread_count); mysql_mutex_unlock(&LOCK_thread_count); DBUG_PRINT("info",("signal thread created")); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 5e12eaf2deb..993f1391b52 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3402,14 +3402,15 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused))) (void) pthread_sigmask(SIG_BLOCK,&set,NULL); for (;;) { - int error; // Used when debugging + int error; + int origin; if (shutdown_in_progress && !abort_loop) { sig= SIGTERM; error=0; } else - while ((error=my_sigwait(&set,&sig)) == EINTR) ; + while ((error= my_sigwait(&set, &sig, &origin)) == EINTR) /* no-op */; if (cleanup_done) { DBUG_PRINT("quit",("signal_handler: calling my_thread_end()")); @@ -3449,7 +3450,7 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused))) } break; case SIGHUP: - if (!abort_loop) + if (!abort_loop && origin != SI_KERNEL) { int not_used; mysql_print_status(); // Print some debug info |