Commit f3ccf506 authored by Alexey Kopytov's avatar Alexey Kopytov

Bug#54667: Unnecessary signal handler redefinition

POSIX requires that a signal handler defined with sigaction()
is not reset on delivering a signal unless SA_NODEFER or
SA_RESETHAND is set. It is therefore unnecessary to redefine
the handler on signal delivery on platforms where sigaction()
is used without those flags.

include/my_alarm.h:
  Renamed DONT_REMEMBER_SIGNAL ->
  SIGNAL_HANDLER_RESET_ON_DELIVERY.
include/my_global.h:
  Renamed DONT_REMEMBER_SIGNAL ->
  SIGNAL_HANDLER_RESET_ON_DELIVERY. The latter is now defined
  only on non-BSD platforms missing the POSIX sigaction()
  function.
libmysql/libmysql.c:
  Renamed DONT_REMEMBER_SIGNAL ->
  SIGNAL_HANDLER_RESET_ON_DELIVERY
mysys/thr_alarm.c:
  Renamed DONT_REMEMBER_SIGNAL ->
  SIGNAL_HANDLER_RESET_ON_DELIVERY
sql/mysqld.cc:
  Renamed DONT_REMEMBER_SIGNAL ->
  SIGNAL_HANDLER_RESET_ON_DELIVERY
parent b36a0282
...@@ -36,14 +36,14 @@ extern ulong my_time_to_wait_for_lock; ...@@ -36,14 +36,14 @@ extern ulong my_time_to_wait_for_lock;
#define ALARM_END VOID(signal(SIGALRM,alarm_signal)); \ #define ALARM_END VOID(signal(SIGALRM,alarm_signal)); \
VOID(alarm(alarm_old)); VOID(alarm(alarm_old));
#define ALARM_TEST my_have_got_alarm #define ALARM_TEST my_have_got_alarm
#ifdef DONT_REMEMBER_SIGNAL #ifdef SIGNAL_HANDLER_RESET_ON_DELIVERY
#define ALARM_REINIT VOID(alarm(MY_HOW_OFTEN_TO_ALARM)); \ #define ALARM_REINIT VOID(alarm(MY_HOW_OFTEN_TO_ALARM)); \
VOID(signal(SIGALRM,my_set_alarm_variable));\ VOID(signal(SIGALRM,my_set_alarm_variable));\
my_have_got_alarm=0; my_have_got_alarm=0;
#else #else
#define ALARM_REINIT VOID(alarm((uint) MY_HOW_OFTEN_TO_ALARM)); \ #define ALARM_REINIT VOID(alarm((uint) MY_HOW_OFTEN_TO_ALARM)); \
my_have_got_alarm=0; my_have_got_alarm=0;
#endif /* DONT_REMEMBER_SIGNAL */ #endif /* SIGNAL_HANDLER_RESET_ON_DELIVERY */
#else #else
#define ALARM_VARIABLES long alarm_pos=0,alarm_end_pos=MY_HOW_OFTEN_TO_WRITE-1 #define ALARM_VARIABLES long alarm_pos=0,alarm_end_pos=MY_HOW_OFTEN_TO_WRITE-1
#define ALARM_INIT #define ALARM_INIT
......
...@@ -541,8 +541,8 @@ extern "C" int madvise(void *addr, size_t len, int behav); ...@@ -541,8 +541,8 @@ extern "C" int madvise(void *addr, size_t len, int behav);
#endif #endif
/* Does the system remember a signal handler after a signal ? */ /* Does the system remember a signal handler after a signal ? */
#ifndef HAVE_BSD_SIGNALS #if !defined(HAVE_BSD_SIGNALS) && !defined(HAVE_SIGACTION)
#define DONT_REMEMBER_SIGNAL #define SIGNAL_HANDLER_RESET_ON_DELIVERY
#endif #endif
/* Define void to stop lint from generating "null effekt" comments */ /* Define void to stop lint from generating "null effekt" comments */
......
...@@ -328,7 +328,7 @@ sig_handler ...@@ -328,7 +328,7 @@ sig_handler
my_pipe_sig_handler(int sig __attribute__((unused))) my_pipe_sig_handler(int sig __attribute__((unused)))
{ {
DBUG_PRINT("info",("Hit by signal %d",sig)); DBUG_PRINT("info",("Hit by signal %d",sig));
#ifdef DONT_REMEMBER_SIGNAL #ifdef SIGNAL_HANDLER_RESET_ON_DELIVERY
(void) signal(SIGPIPE, my_pipe_sig_handler); (void) signal(SIGPIPE, my_pipe_sig_handler);
#endif #endif
} }
......
...@@ -306,7 +306,7 @@ sig_handler process_alarm(int sig __attribute__((unused))) ...@@ -306,7 +306,7 @@ sig_handler process_alarm(int sig __attribute__((unused)))
#if defined(MAIN) && !defined(__bsdi__) #if defined(MAIN) && !defined(__bsdi__)
printf("thread_alarm in process_alarm\n"); fflush(stdout); printf("thread_alarm in process_alarm\n"); fflush(stdout);
#endif #endif
#ifdef DONT_REMEMBER_SIGNAL #ifdef SIGNAL_HANDLER_RESET_ON_DELIVERY
my_sigset(thr_client_alarm, process_alarm); /* int. thread system calls */ my_sigset(thr_client_alarm, process_alarm); /* int. thread system calls */
#endif #endif
return; return;
...@@ -325,7 +325,7 @@ sig_handler process_alarm(int sig __attribute__((unused))) ...@@ -325,7 +325,7 @@ sig_handler process_alarm(int sig __attribute__((unused)))
#endif #endif
process_alarm_part2(sig); process_alarm_part2(sig);
#ifndef USE_ALARM_THREAD #ifndef USE_ALARM_THREAD
#if defined(DONT_REMEMBER_SIGNAL) && !defined(USE_ONE_SIGNAL_HAND) #if defined(SIGNAL_HANDLER_RESET_ON_DELIVERY) && !defined(USE_ONE_SIGNAL_HAND)
my_sigset(THR_SERVER_ALARM,process_alarm); my_sigset(THR_SERVER_ALARM,process_alarm);
#endif #endif
pthread_mutex_unlock(&LOCK_alarm); pthread_mutex_unlock(&LOCK_alarm);
...@@ -523,12 +523,12 @@ void thr_alarm_info(ALARM_INFO *info) ...@@ -523,12 +523,12 @@ void thr_alarm_info(ALARM_INFO *info)
*/ */
static sig_handler thread_alarm(int sig) static sig_handler thread_alarm(int sig __attribute__((unused)))
{ {
#ifdef MAIN #ifdef MAIN
printf("thread_alarm\n"); fflush(stdout); printf("thread_alarm\n"); fflush(stdout);
#endif #endif
#ifdef DONT_REMEMBER_SIGNAL #ifdef SIGNAL_HANDLER_RESET_ON_DELIVERY
my_sigset(sig,thread_alarm); /* int. thread system calls */ my_sigset(sig,thread_alarm); /* int. thread system calls */
#endif #endif
} }
...@@ -797,7 +797,7 @@ static sig_handler print_signal_warning(int sig) ...@@ -797,7 +797,7 @@ static sig_handler print_signal_warning(int sig)
{ {
printf("Warning: Got signal %d from thread %s\n",sig,my_thread_name()); printf("Warning: Got signal %d from thread %s\n",sig,my_thread_name());
fflush(stdout); fflush(stdout);
#ifdef DONT_REMEMBER_SIGNAL #ifdef SIGNAL_HANDLER_RESET_ON_DELIVERY
my_sigset(sig,print_signal_warning); /* int. thread system calls */ my_sigset(sig,print_signal_warning); /* int. thread system calls */
#endif #endif
if (sig == SIGALRM) if (sig == SIGALRM)
......
...@@ -1232,7 +1232,7 @@ extern "C" sig_handler print_signal_warning(int sig) ...@@ -1232,7 +1232,7 @@ extern "C" sig_handler print_signal_warning(int sig)
{ {
if (global_system_variables.log_warnings) if (global_system_variables.log_warnings)
sql_print_warning("Got signal %d from thread %ld", sig,my_thread_id()); sql_print_warning("Got signal %d from thread %ld", sig,my_thread_id());
#ifdef DONT_REMEMBER_SIGNAL #ifdef SIGNAL_HANDLER_RESET_ON_DELIVERY
my_sigset(sig,print_signal_warning); /* int. thread system calls */ my_sigset(sig,print_signal_warning); /* int. thread system calls */
#endif #endif
#if !defined(__WIN__) && !defined(__NETWARE__) #if !defined(__WIN__) && !defined(__NETWARE__)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment