aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2024-04-23 15:03:25 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2024-04-23 15:03:25 +0100
commit917cdf87bf1447839522adb5e81e12b611b69a26 (patch)
tree85df11a0fe8c8b24fca7714a8fac05258b496ea4
parent980cd40f8df84b88af0a08694367daf2204b459f (diff)
downloadrspamd-917cdf87bf1447839522adb5e81e12b611b69a26.tar.gz
rspamd-917cdf87bf1447839522adb5e81e12b611b69a26.zip
[Minor] Add function to reschedule events at specific timer
-rw-r--r--src/libutil/libev_helper.c30
-rw-r--r--src/libutil/libev_helper.h17
2 files changed, 44 insertions, 3 deletions
diff --git a/src/libutil/libev_helper.c b/src/libutil/libev_helper.c
index 3b880aaa2..203e1ed73 100644
--- a/src/libutil/libev_helper.c
+++ b/src/libutil/libev_helper.c
@@ -108,4 +108,34 @@ void rspamd_ev_watcher_reschedule(struct ev_loop *loop,
ev_timer_start(EV_A, &ev->tm);
}
}
+}
+
+void rspamd_ev_watcher_reschedule_at(struct ev_loop *loop,
+ struct rspamd_io_ev *ev,
+ short what,
+ ev_tstamp at)
+{
+ g_assert(ev->cb != NULL);
+
+ if (ev_can_stop(&ev->io)) {
+ ev_io_stop(EV_A, &ev->io);
+ ev_io_set(&ev->io, ev->io.fd, what);
+ ev_io_start(EV_A, &ev->io);
+ }
+ else {
+ ev->io.data = ev;
+ ev_io_init(&ev->io, rspamd_ev_watcher_io_cb, ev->io.fd, what);
+ ev_io_start(EV_A, &ev->io);
+ }
+
+ if (at > 0) {
+ if (!(ev_can_stop(&ev->tm))) {
+ /* Update timestamp to avoid timers running early */
+ ev_now_update_if_cheap(loop);
+
+ ev->tm.data = ev;
+ ev_timer_init(&ev->tm, rspamd_ev_watcher_timer_cb, at, 0.0);
+ ev_timer_start(EV_A, &ev->tm);
+ }
+ }
} \ No newline at end of file
diff --git a/src/libutil/libev_helper.h b/src/libutil/libev_helper.h
index 44d1604b0..d68f17951 100644
--- a/src/libutil/libev_helper.h
+++ b/src/libutil/libev_helper.h
@@ -1,11 +1,11 @@
-/*-
- * Copyright 2019 Vsevolod Stakhov
+/*
+ * Copyright 2024 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -79,6 +79,17 @@ void rspamd_ev_watcher_reschedule(struct ev_loop *loop,
struct rspamd_io_ev *ev,
short what);
+/**
+ * Convenience function to reschedule watcher with different events and different timeout
+ * @param loop
+ * @param ev
+ * @param what
+ */
+void rspamd_ev_watcher_reschedule_at(struct ev_loop *loop,
+ struct rspamd_io_ev *ev,
+ short what,
+ ev_tstamp at);
+
#ifdef __cplusplus
}
#endif