summary refs log tree commit diff
path: root/shared/n-acd/src/util/timer.h
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2019-03-26 23:25:23 +0100
committerMichael Biebl <biebl@debian.org>2019-03-26 23:25:23 +0100
commit9a6dcbf895f9da01768e64b73cec88c16157d91e (patch)
treea359958930d731e9f1b59344642e10754419fe84 /shared/n-acd/src/util/timer.h
parent964ae8cc391520440cf5aa13e2b9cc34850ea6c2 (diff)
New upstream version 1.16.0 upstream/1.16.0
Diffstat (limited to 'shared/n-acd/src/util/timer.h')
-rw-r--r--shared/n-acd/src/util/timer.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/shared/n-acd/src/util/timer.h b/shared/n-acd/src/util/timer.h
new file mode 100644
index 00000000..2acc99e3
--- /dev/null
+++ b/shared/n-acd/src/util/timer.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include <c-rbtree.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+typedef struct Timer Timer;
+typedef struct Timeout Timeout;
+
+enum {
+        _TIMER_E_SUCCESS,
+
+        TIMER_E_TRIGGERED,
+
+        _TIMER_E_N,
+};
+
+struct Timer {
+        int fd;
+        clockid_t clock;
+        CRBTree tree;
+        uint64_t scheduled_timeout;
+};
+
+#define TIMER_NULL(_x) {                                                        \
+                .fd = -1,                                                       \
+                .tree = C_RBTREE_INIT,                                          \
+        }
+
+struct Timeout {
+        Timer *timer;
+        CRBNode node;
+        uint64_t timeout;
+};
+
+#define TIMEOUT_INIT(_x) {                                                      \
+                .node = C_RBNODE_INIT((_x).node),                               \
+        }
+
+int timer_init(Timer *timer);
+void timer_deinit(Timer *timer);
+
+void timer_now(Timer *timer, uint64_t *nowp);
+
+int timer_pop_timeout(Timer *timer, uint64_t now, Timeout **timerp);
+void timer_rearm(Timer *timer);
+int timer_read(Timer *timer);
+
+void timeout_schedule(Timeout *timeout, Timer *timer, uint64_t time);
+void timeout_unschedule(Timeout *timeout);
+