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''
This commit is contained in:
unknown 2005-10-11 09:12:12 -07:00
commit e61dea1b36
11 changed files with 77 additions and 99 deletions

View file

@ -92,7 +92,14 @@ int vio_blocking(Vio * vio __attribute__((unused)), my_bool set_blocking_mode,
else
vio->fcntl_mode |= O_NONBLOCK; /* set bit */
if (old_fcntl != vio->fcntl_mode)
r = fcntl(vio->sd, F_SETFL, vio->fcntl_mode);
{
r= fcntl(vio->sd, F_SETFL, vio->fcntl_mode);
if (r == -1)
{
DBUG_PRINT("info", ("fcntl failed, errno %d", errno));
vio->fcntl_mode= old_fcntl;
}
}
}
#else
r= set_blocking_mode ? 0 : 1;