From fe72c885d938881a876affe1c930aedb64a11306 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Thu, 22 Jan 2009 06:23:14 +0000 Subject: [PATCH] fix signal processing for non-kqueue backends; when a signal callback delivers a signal; from Alexander Drozdov svn:r1035 --- signal.c | 2 +- test/regress.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/signal.c b/signal.c index 2ceed2f3..5388ca84 100644 --- 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 diff --git a/test/regress.c b/test/regress.c index bfc09751..8b979d94 100644 --- a/test/regress.c +++ b/test/regress.c @@ -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); -- 2.50.1