commit d3a1896: [Rework] Timeouts are now global per event and not reseted by IO activity
Vsevolod Stakhov
vsevolod at highsecure.ru
Thu Jan 6 15:21:04 UTC 2022
Author: Vsevolod Stakhov
Date: 2022-01-06 15:12:50 +0000
URL: https://github.com/rspamd/rspamd/commit/d3a1896577a0c8da2dc1d8908f99cbdbc0c23350 (HEAD -> master)
[Rework] Timeouts are now global per event and not reseted by IO activity
This actually reproduces old libevent behaviour and it was changed by a big design mistake.
We really want IO timeouts to be fired for the whole set of subsequent events, otherwise it should be
designed in a more configurable way...
---
src/libutil/libev_helper.c | 24 +++++++-----------------
src/libutil/libev_helper.h | 1 -
2 files changed, 7 insertions(+), 18 deletions(-)
diff --git a/src/libutil/libev_helper.c b/src/libutil/libev_helper.c
index 41195bfa6..315a15bc7 100644
--- a/src/libutil/libev_helper.c
+++ b/src/libutil/libev_helper.c
@@ -21,7 +21,6 @@ rspamd_ev_watcher_io_cb (EV_P_ struct ev_io *w, int revents)
{
struct rspamd_io_ev *ev = (struct rspamd_io_ev *)w->data;
- ev->last_activity = ev_now (EV_A);
ev->cb (ev->io.fd, revents, ev->ud);
}
@@ -30,17 +29,11 @@ rspamd_ev_watcher_timer_cb (EV_P_ struct ev_timer *w, int revents)
{
struct rspamd_io_ev *ev = (struct rspamd_io_ev *)w->data;
- ev_tstamp after = ev->last_activity - ev_now (EV_A) + ev->timeout;
-
- if (after < 0.) {
- /* Real timeout */
- ev->cb (ev->io.fd, EV_TIMER, ev->ud);
- }
- else {
- /* Start another cycle as there was some activity */
- w->repeat = after;
- ev_timer_again (EV_A_ w);
- }
+ /*
+ * We now call timeout callback in all the cases, as we assume that all
+ * timeouts are final
+ */
+ ev->cb (ev->io.fd, EV_TIMER, ev->ud);
}
@@ -66,12 +59,11 @@ rspamd_ev_watcher_start (struct ev_loop *loop,
{
g_assert (ev->cb != NULL);
- ev->last_activity = ev_now (EV_A);
ev_io_start (EV_A_ &ev->io);
if (timeout > 0) {
/* Update timestamp to avoid timers running early */
- ev_now_update (loop);
+ ev_now_update_if_cheap (loop);
ev->timeout = timeout;
ev_timer_set (&ev->tm, timeout, 0.0);
@@ -113,13 +105,11 @@ rspamd_ev_watcher_reschedule (struct ev_loop *loop,
if (ev->timeout > 0) {
if (!(ev_can_stop (&ev->tm))) {
/* Update timestamp to avoid timers running early */
- ev_now_update (loop);
+ ev_now_update_if_cheap (loop);
ev->tm.data = ev;
ev_timer_init (&ev->tm, rspamd_ev_watcher_timer_cb, ev->timeout, 0.0);
ev_timer_start (EV_A_ &ev->tm);
}
}
-
- ev->last_activity = ev_now (EV_A);
}
\ No newline at end of file
diff --git a/src/libutil/libev_helper.h b/src/libutil/libev_helper.h
index 8502043e6..fc344736f 100644
--- a/src/libutil/libev_helper.h
+++ b/src/libutil/libev_helper.h
@@ -37,7 +37,6 @@ struct rspamd_io_ev {
ev_timer tm;
rspamd_ev_cb cb;
void *ud;
- ev_tstamp last_activity;
ev_tstamp timeout;
};
More information about the Commits
mailing list