Commit e61dea1b authored by unknown's avatar unknown
Browse files

Fix wait_timeout (and kill) handling on Mac OS X by cleaning up how

signal handlers are set up, the blocking flags for sockets are set,
and which thread-related functions are used. (Bug #8731)


configure.in:
  Fix flags for Darwin 6 and later. Simplify Darwin 7-9 blocks to simply
  be a catch-all for *darwin* so that future Darwin releases get the
  latest flags.
include/config-win.h:
  Define my_sigset() instead of sigset().
include/my_pthread.h:
  Define my_sigset() instead of trying to monkey with sigset(), and favor
  an implementation based on sigaction().
mysys/my_pthread.c:
  Remove pthread_signal(), which is identical to the new my_sigset() macro.
mysys/thr_alarm.c:
  Use my_sigset() instead of sigset().
sql/mysqld.cc:
  Use my_sigset() instead of signal() and sigset(), remove unnecessary
  definition of sigset on __amiga__. Remove unused THREAD_SPECIFIC_SIGPIPE
  code.
  
  A future improvement would be to re-assess the use of sigaction() here
  and convert its usage to use my_sigset().
vio/vio.c:
  Always call fcntl() to initialize flags of socket in initialization to
  avoid problems on systems that don't report the flags on a socket
  correctly right after it has been returned from accept(), such as
  FreeBSD, Mac OS X, and possibly other BSD-derived systems.
vio/viosocket.c:
  If fcntl() fails in vio_blocking(), restore the flags stored in the
  vio struct.
mysql-test/r/wait_timeout.result:
  New BitKeeper file ``mysql-test/r/wait_timeout.result''
mysql-test/t/wait_timeout-master.opt:
  New BitKeeper file ``mysql-test/t/wait_timeout-master.opt''
mysql-test/t/wait_timeout.test:
  New BitKeeper file ``mysql-test/t/wait_timeout.test''
parent 78f5997a
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -1102,7 +1102,7 @@ case $SYSTEM_TYPE in
  *darwin5*)
    if test "$ac_cv_prog_gcc" = "yes"
    then
      FLAGS="-traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH"
      FLAGS="-traditional-cpp -DHAVE_DARWIN5_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH"
      CFLAGS="$CFLAGS $FLAGS"
      CXXFLAGS="$CXXFLAGS $FLAGS"
      MAX_C_OPTIMIZE="-O"
@@ -1112,23 +1112,13 @@ case $SYSTEM_TYPE in
  *darwin6*)
    if test "$ac_cv_prog_gcc" = "yes"
    then
      FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH"
      FLAGS="-D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH"
      CFLAGS="$CFLAGS $FLAGS"
      CXXFLAGS="$CXXFLAGS $FLAGS"
      MAX_C_OPTIMIZE="-O"
    fi
    ;;
  *darwin[[7-8]]*)
    # don't forget to escape [] like above
    if test "$ac_cv_prog_gcc" = "yes"
    then
      FLAGS="-DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT"
      CFLAGS="$CFLAGS $FLAGS"
      CXXFLAGS="$CXXFLAGS $FLAGS"
      MAX_C_OPTIMIZE="-O"
    fi
    ;;
  *darwin9*)
  *darwin*)
    if test "$ac_cv_prog_gcc" = "yes"
    then
      FLAGS="-D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT"
+1 −1
Original line number Diff line number Diff line
@@ -192,7 +192,7 @@ typedef uint rf_SetTimer;

/* Convert some simple functions to Posix */

#define sigset(A,B) signal((A),(B))
#define my_sigset(A,B) signal((A),(B))
#define finite(A) _finite(A)
#define sleep(A)  Sleep((A)*1000)
#define popen(A) popen(A,B) _popen((A),(B))
+21 −14
Original line number Diff line number Diff line
@@ -289,8 +289,6 @@ extern int my_pthread_create_detached;
#undef HAVE_PTHREAD_RWLOCK_RDLOCK
#undef HAVE_SNPRINTF

#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
#define signal(A,B) pthread_signal((A),(void (*)(int)) (B))
#define my_pthread_attr_setprio(A,B)
#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */

@@ -322,14 +320,26 @@ extern int my_pthread_cond_init(pthread_cond_t *mp,
#if !defined(HAVE_SIGWAIT) && !defined(HAVE_mit_thread) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX)
int sigwait(sigset_t *setp, int *sigp);		/* Use our implemention */
#endif
#if !defined(HAVE_SIGSET) && !defined(HAVE_mit_thread) && !defined(sigset)
#define sigset(A,B) do { struct sigaction s; sigset_t set;              \


/*
  We define my_sigset() and use that instead of the system sigset() so that
  we can favor an implementation based on sigaction(). On some systems, such
  as Mac OS X, sigset() results in flags such as SA_RESTART being set, and
  we want to make sure that no such flags are set.
*/
#if defined(HAVE_SIGACTION) && !defined(my_sigset)
#define my_sigset(A,B) do { struct sigaction s; sigset_t set;              \
                            sigemptyset(&set);                             \
                            s.sa_handler = (B);                            \
                            s.sa_mask    = set;                            \
                            s.sa_flags   = 0;                              \
                            sigaction((A), &s, (struct sigaction *) NULL); \
                          } while (0)
#elif defined(HAVE_SIGSET) && !defined(my_sigset)
#define my_sigset(A,B) sigset((A),(B))
#elif !defined(my_sigset)
#define my_sigset(A,B) signal((A),(B))
#endif

#ifndef my_pthread_setprio
@@ -409,16 +419,13 @@ struct tm *gmtime_r(const time_t *clock, struct tm *res);
#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
#endif

#ifdef HAVE_DARWIN_THREADS
#ifdef HAVE_DARWIN5_THREADS
#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
#define pthread_kill(A,B) pthread_dummy(0)
#define pthread_condattr_init(A) pthread_dummy(0)
#define pthread_condattr_destroy(A) pthread_dummy(0)
#define pthread_signal(A,B) pthread_dummy(0)
#undef	pthread_detach_this_thread
#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
#undef sigset
#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
#endif

#if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) && !defined(HAVE_CTHREADS_WRAPPER)
+8 −0
Original line number Diff line number Diff line
select 1;
1
1
select 2;
ERROR HY000: MySQL server has gone away
select 3;
3
3
+1 −0
Original line number Diff line number Diff line
--wait-timeout=2
Loading