Revert "Use ev_signal to avoid async-unsafe functions (Thanks Markus)"

This makes our signal handler useless and leads to infinite SIGSEGV
loops because the ev callback handler gets called only from within the
event loop, and control doesn’t necessary get to the event loop…

This reverts commit 514265b529.
next
Michael Stapelberg 2012-09-27 12:34:09 +02:00
parent 87525ad2d6
commit 9c01bdeef7
1 changed files with 17 additions and 20 deletions

View File

@ -232,15 +232,13 @@ static void i3_exit(void) {
* Unlinks the SHM log and re-raises the signal.
*
*/
static void handle_signal(struct ev_loop *loop, ev_signal *w, int revents) {
int sig = w->signum;
static void handle_signal(int sig, siginfo_t *info, void *data) {
fprintf(stderr, "Received signal %d, terminating\n", sig);
if (*shmlogname != '\0') {
fprintf(stderr, "Closing SHM log \"%s\"\n", shmlogname);
shm_unlink(shmlogname);
}
fflush(stderr);
ev_signal_stop(loop, w);
raise(sig);
}
@ -783,32 +781,31 @@ int main(int argc, char *argv[]) {
}
xcb_ungrab_server(conn);
struct sigaction action;
#define HANDLE_SIGNAL_EV(signum) \
do { \
struct ev_signal *signal_watcher = scalloc(sizeof(struct ev_signal)); \
ev_signal_init(signal_watcher, handle_signal, signum); \
ev_signal_start(main_loop, signal_watcher); \
} while (0)
action.sa_sigaction = handle_signal;
action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
sigemptyset(&action.sa_mask);
if (!disable_signalhandler)
setup_signal_handler();
else {
/* Catch all signals with default action "Core", see signal(7) */
HANDLE_SIGNAL_EV(SIGQUIT);
HANDLE_SIGNAL_EV(SIGILL);
HANDLE_SIGNAL_EV(SIGABRT);
HANDLE_SIGNAL_EV(SIGFPE);
HANDLE_SIGNAL_EV(SIGSEGV);
if (sigaction(SIGQUIT, &action, NULL) == -1 ||
sigaction(SIGILL, &action, NULL) == -1 ||
sigaction(SIGABRT, &action, NULL) == -1 ||
sigaction(SIGFPE, &action, NULL) == -1 ||
sigaction(SIGSEGV, &action, NULL) == -1)
ELOG("Could not setup signal handler");
}
/* Catch all signals with default action "Term", see signal(7) */
HANDLE_SIGNAL_EV(SIGHUP);
HANDLE_SIGNAL_EV(SIGINT);
HANDLE_SIGNAL_EV(SIGALRM);
HANDLE_SIGNAL_EV(SIGTERM);
HANDLE_SIGNAL_EV(SIGUSR1);
HANDLE_SIGNAL_EV(SIGUSR2);
if (sigaction(SIGHUP, &action, NULL) == -1 ||
sigaction(SIGINT, &action, NULL) == -1 ||
sigaction(SIGALRM, &action, NULL) == -1 ||
sigaction(SIGUSR1, &action, NULL) == -1 ||
sigaction(SIGUSR2, &action, NULL) == -1)
ELOG("Could not setup signal handler");
/* Ignore SIGPIPE to survive errors when an IPC client disconnects
* while we are sending him a message */