From bd03d0682ce4d3d84169b051e8a8ccdd8b79b2c4 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 14 Jan 2010 18:22:00 -0500 Subject: [PATCH] Re-add event_siglcb; some old code _was_ still using it. :( Such code really needs to migrate to use signal events instead. This reverts commit 072ae5887e8064da500adbd2d24050bb96fbe75d. --- event.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/event.c b/event.c index d7ccd3f1..96bd0bd0 100644 --- a/event.c +++ b/event.c @@ -109,6 +109,10 @@ struct event_base *current_base = NULL; extern struct event_base *evsignal_base; static int use_monotonic; +/* Handle signals - This is a deprecated interface */ +int (*event_sigcb)(void); /* Signal callback when gotsig is set */ +volatile sig_atomic_t event_gotsig; /* Set in signal handler */ + /* Prototypes */ static void event_queue_insert(struct event_base *, struct event *, int); static void event_queue_remove(struct event_base *, struct event *, int); @@ -175,6 +179,9 @@ event_base_new(void) if ((base = calloc(1, sizeof(struct event_base))) == NULL) event_err(1, "%s: calloc", __func__); + event_sigcb = NULL; + event_gotsig = 0; + detect_monotonic(); gettime(base, &base->event_tv); @@ -383,7 +390,7 @@ event_process_active(struct event_base *base) ncalls--; ev->ev_ncalls = ncalls; (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg); - if (base->event_break) + if (event_gotsig || base->event_break) return; } } @@ -488,6 +495,18 @@ event_base_loop(struct event_base *base, int flags) break; } + /* You cannot use this interface for multi-threaded apps */ + while (event_gotsig) { + event_gotsig = 0; + if (event_sigcb) { + res = (*event_sigcb)(); + if (res == -1) { + errno = EINTR; + return (-1); + } + } + } + timeout_correct(base, &tv); tv_p = &tv;