summaryrefslogtreecommitdiff
path: root/libhw_cr/alarmclock.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhw_cr/alarmclock.c')
-rw-r--r--libhw_cr/alarmclock.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/libhw_cr/alarmclock.c b/libhw_cr/alarmclock.c
new file mode 100644
index 0000000..6eec52b
--- /dev/null
+++ b/libhw_cr/alarmclock.c
@@ -0,0 +1,23 @@
+/* libhw_cr/alarmclock.c - sleep() implementation for libcr
+ *
+ * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#include <libcr/coroutine.h>
+
+#include <libhw/generic/alarmclock.h>
+
+static void alarmclock_sleep_intrhandler(void *_arg) {
+ cid_t cid = *(cid_t *)_arg;
+ cr_unpause_from_intrhandler(cid);
+}
+
+void alarmclock_sleep_until_ns(lo_interface alarmclock clock, uint64_t abstime_ns) {
+ bool saved = cr_save_and_disable_interrupts();
+ cid_t cid = cr_getcid();
+ struct alarmclock_trigger trigger;
+ LO_CALL(clock, add_trigger, &trigger, abstime_ns, alarmclock_sleep_intrhandler, &cid);
+ cr_pause_and_yield();
+ cr_restore_interrupts(saved);
+}