summaryrefslogtreecommitdiff
path: root/libcr_ipc/coroutine_sema.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcr_ipc/coroutine_sema.h')
-rw-r--r--libcr_ipc/coroutine_sema.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/libcr_ipc/coroutine_sema.h b/libcr_ipc/coroutine_sema.h
new file mode 100644
index 0000000..57d5855
--- /dev/null
+++ b/libcr_ipc/coroutine_sema.h
@@ -0,0 +1,35 @@
+/* coroutine_sema.h - Simple semaphores for coroutine.{h,c}
+ *
+ * Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+ * SPDX-Licence-Identifier: AGPL-3.0-or-later
+ */
+
+#ifndef _COROUTINE_SEMA_H_
+#define _COROUTINE_SEMA_H_
+
+/**
+ * A cr_sema_t is a fair unbounded[1] counting semaphore.
+ *
+ * [1]: Well, INT_MAX
+ */
+typedef struct sema_t cr_sema_t;
+
+/**
+ * Increment the semaphore,
+ *
+ * @blocks never
+ * @yields never
+ * @run_in anywhere (coroutine, sighandler)
+ */
+void cr_sema_signal(cr_sema_t *sema);
+
+/**
+ * Wait until the semaphore is >0, then decrement it.
+ *
+ * @blocks maybe
+ * @yields maybe
+ * @may_run_in coroutine
+ */
+void cr_sema_wait(cr_sema_t *sema);
+
+#endif /* _COROUTINE_SEMA_H_ */