]> git.sur5r.net Git - i3/i3/commitdiff
Revert "Use ev_signal to avoid async-unsafe functions (Thanks Markus)"
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 27 Sep 2012 10:34:09 +0000 (12:34 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 27 Sep 2012 10:34:09 +0000 (12:34 +0200)
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 514265b529ac78b7778eeee2db3dddb6f3a1c24c.

src/main.c

index 65db1711c40845710233535463ab8a465c9cc5ae..95498e34e5309ef1f8e2401d2e19521d234e97fd 100644 (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 */