X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsigaction.c;h=659c4ec531e341b533ba59a10dd69ea6d6704441;hb=5eb934dfd78a8ff086ffef87f5d4ec18e2d45cf7;hp=1bad8092f2795077329db8ed282fbcfca6872805;hpb=371a3a2d058f3709baeeb0dbe18ae21ddb11ea90;p=gnulib.git diff --git a/lib/sigaction.c b/lib/sigaction.c index 1bad8092f..659c4ec53 100644 --- a/lib/sigaction.c +++ b/lib/sigaction.c @@ -1,5 +1,5 @@ /* POSIX compatible signal blocking. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2012 Free Software Foundation, Inc. Written by Eric Blake , 2008. This program is free software: you can redistribute it and/or modify @@ -24,7 +24,7 @@ #include #include -/* This implementation of sigaction is tailored to Woe32 behavior: +/* This implementation of sigaction is tailored to native Windows behavior: signal() has SysV semantics (ie. the handler is uninstalled before it is invoked). This is an inherent data race if an asynchronous signal is sent twice in a row before we can reinstall our handler, @@ -39,9 +39,9 @@ - We don't implement SA_NOCLDSTOP or SA_NOCLDWAIT, because SIGCHLD is not defined. - We don't implement SA_ONSTACK, because sigaltstack() is not present. - - We ignore SA_RESTART, because blocking Win32 calls are not interrupted - anyway when an asynchronous signal occurs, and the MSVCRT runtime - never sets errno to EINTR. + - We ignore SA_RESTART, because blocking native Windows API calls are + not interrupted anyway when an asynchronous signal occurs, and the + MSVCRT runtime never sets errno to EINTR. - We don't implement SA_SIGINFO because it is impossible to do so portably. @@ -64,6 +64,14 @@ # define SIGSTOP (-1) #endif +/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias + for the signal SIGABRT. Only one signal handler is stored for both + SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# undef SIGABRT_COMPAT +# define SIGABRT_COMPAT 6 +#endif + /* A signal handler. */ typedef void (*handler_t) (int signal); @@ -83,7 +91,7 @@ sigaction_handler (int sig) { /* Unexpected situation; be careful to avoid recursive abort. */ if (sig == SIGABRT) - signal (SIGABRT, SIG_DFL); + signal (SIGABRT, SIG_DFL); abort (); } @@ -134,6 +142,11 @@ sigaction (int sig, const struct sigaction *restrict act, return -1; } +#ifdef SIGABRT_COMPAT + if (sig == SIGABRT_COMPAT) + sig = SIGABRT; +#endif + /* POSIX requires sigaction() to be async-signal-safe. In other words, if an asynchronous signal can occur while we are anywhere inside this function, the user's handler could then call