fix signal processing for non-kqueue backends; when a signal callback delivers a...
authorNiels Provos <provos@gmail.com>
Thu, 22 Jan 2009 06:23:14 +0000 (06:23 +0000)
committerNiels Provos <provos@gmail.com>
Thu, 22 Jan 2009 06:23:14 +0000 (06:23 +0000)
svn:r1035

signal.c
test/regress.c

index 2ceed2f3aad6ee05ac38dbc202bb262ad8f7fe73..5388ca8458bdb0fe1847eb15ac6d78ebd8dedf50 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -86,7 +86,7 @@ static void evsig_handler(int sig);
 static void
 evsig_cb(evutil_socket_t fd, short what, void *arg)
 {
-       static char signals[100];
+       static char signals[1];
 #ifdef WIN32
        SSIZE_T n;
 #else
index bfc09751e882a816bfa1b3cf4646aec7b6b301f6..8b979d94bb5808668371ecacf87c4f0290a0750c 100644 (file)
@@ -863,6 +863,52 @@ out:
        cleanup_test();
        return;
 }
+
+void
+signal_cb_swp(int sig, short event, void *arg)
+{
+       called++;
+       if (called < 5)
+               raise(sig);
+       else
+               event_loopexit(NULL);
+}
+void
+timeout_cb_swp(int fd, short event, void *arg)
+{
+       if (called == -1) {
+               struct timeval tv = {5, 0};
+
+               called = 0;
+               evtimer_add((struct event *)arg, &tv);
+               raise(SIGUSR1);
+               return;
+       }
+       test_ok = 0;
+       event_loopexit(NULL);
+}
+
+static void
+test_signal_while_processing(void)
+{
+       struct event_base *base = event_init();
+       struct event ev, ev_timer;
+       struct timeval tv = {0, 0};
+
+       setup_test("Receiving a signal while processing other signal: ");
+
+       called = -1;
+       test_ok = 1;
+       signal_set(&ev, SIGUSR1, signal_cb_swp, NULL);
+       signal_add(&ev, NULL);
+       evtimer_set(&ev_timer, timeout_cb_swp, &ev_timer);
+       evtimer_add(&ev_timer, &tv);
+       event_dispatch();
+
+       event_base_free(base);
+       cleanup_test();
+       return;
+}
 #endif
 
 static void
@@ -2413,6 +2459,7 @@ main (int argc, char **argv)
        test_signal_switchbase();
        test_signal_restore();
        test_signal_assert();
+       test_signal_while_processing();
 #endif
        
        return (0);