summaryrefslogtreecommitdiff
path: root/libhw/host_alarmclock.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhw/host_alarmclock.c')
-rw-r--r--libhw/host_alarmclock.c68
1 files changed, 14 insertions, 54 deletions
diff --git a/libhw/host_alarmclock.c b/libhw/host_alarmclock.c
index 5f7e494..19ece7c 100644
--- a/libhw/host_alarmclock.c
+++ b/libhw/host_alarmclock.c
@@ -1,62 +1,27 @@
/* libhw/host_alarmclock.c - <libhw/generic/alarmclock.h> implementation for POSIX hosts
*
- * Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include <errno.h>
#include <error.h>
#include <signal.h>
-#include <time.h>
#include <libcr/coroutine.h>
#include <libmisc/assert.h>
-#include <libmisc/vcall.h>
#define IMPLEMENTATION_FOR_LIBHW_GENERIC_ALARMCLOCK_H YES
#include <libhw/generic/alarmclock.h>
+#define IMPLEMENTATION_FOR_LIBHW_HOST_ALARMCLOCK_H YES
+#include <libhw/host_alarmclock.h>
+
#include "host_util.h" /* for host_sigrt_alloc(), ns_to_host_ns_time() */
-/* Types **********************************************************************/
-
-struct hostclock {
- implements_alarmclock;
- bool initialized;
- clockid_t clock_id;
- timer_t timer_id;
- struct alarmclock_trigger *queue;
-};
-
-/* Globals ********************************************************************/
-
-static uint64_t hostclock_get_time_ns(implements_alarmclock *self);
-static bool hostclock_add_trigger(implements_alarmclock *self,
- struct alarmclock_trigger *trigger,
- uint64_t fire_at_ns,
- void (*cb)(void *),
- void *cb_arg);
-static void hostclock_del_trigger(implements_alarmclock *self,
- struct alarmclock_trigger *trigger);
-
-static struct alarmclock_vtable hostclock_vtable = {
- .get_time_ns = hostclock_get_time_ns,
- .add_trigger = hostclock_add_trigger,
- .del_trigger = hostclock_del_trigger,
-};
-
-static struct hostclock clock_monotonic = {
- .vtable = &hostclock_vtable,
- .clock_id = CLOCK_MONOTONIC,
-};
-
-implements_alarmclock *bootclock = &clock_monotonic;
-
-/* Main implementation ********************************************************/
-
-static uint64_t hostclock_get_time_ns(implements_alarmclock *_alarmclock) {
- struct hostclock *alarmclock =
- VCALL_SELF(struct hostclock, implements_alarmclock, _alarmclock);
+LO_IMPLEMENTATION_C(alarmclock, struct hostclock, hostclock, static)
+
+static uint64_t hostclock_get_time_ns(struct hostclock *alarmclock) {
assert(alarmclock);
struct timespec ts;
@@ -91,13 +56,11 @@ static void hostclock_handle_sig_alarm(int LM_UNUSED(sig), siginfo_t *info, void
}
}
-static bool hostclock_add_trigger(implements_alarmclock *_alarmclock,
- struct alarmclock_trigger *trigger,
- uint64_t fire_at_ns,
- void (*cb)(void *),
- void *cb_arg) {
- struct hostclock *alarmclock =
- VCALL_SELF(struct hostclock, implements_alarmclock, _alarmclock);
+static bool hostclock_add_trigger(struct hostclock *alarmclock,
+ struct alarmclock_trigger *trigger,
+ uint64_t fire_at_ns,
+ void (*cb)(void *),
+ void *cb_arg) {
assert(alarmclock);
assert(trigger);
assert(fire_at_ns);
@@ -148,11 +111,8 @@ static bool hostclock_add_trigger(implements_alarmclock *_alarmclock,
return false;
}
-static void hostclock_del_trigger(implements_alarmclock *_alarmclock,
- struct alarmclock_trigger *trigger) {
- struct hostclock *alarmclock =
- VCALL_SELF(struct hostclock, implements_alarmclock, _alarmclock);
-
+static void hostclock_del_trigger(struct hostclock *alarmclock,
+ struct alarmclock_trigger *trigger) {
assert(alarmclock);
assert(trigger);