summaryrefslogtreecommitdiff
path: root/libcr_ipc
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-04-16 05:21:31 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-04-16 05:27:24 -0600
commitf56ae03840bb264163c4035eb72fbac938847638 (patch)
tree30008026f025696066024c8d32001cf938afb9cc /libcr_ipc
parentcf102e5e0ce3dfcba0a2dbb6c3d16883e0525b41 (diff)
lib9p_srv: Re-think Tflush semantics
Diffstat (limited to 'libcr_ipc')
-rw-r--r--libcr_ipc/chan.c2
-rw-r--r--libcr_ipc/include/libcr_ipc/chan.h16
2 files changed, 18 insertions, 0 deletions
diff --git a/libcr_ipc/chan.c b/libcr_ipc/chan.c
index 7708fe4..b7ecfc8 100644
--- a/libcr_ipc/chan.c
+++ b/libcr_ipc/chan.c
@@ -100,6 +100,7 @@ size_t cr_select_v(size_t arg_cnt, struct _cr_select_arg_list_node arg_vec[]) {
}
struct _cr_select_waiter *waiter = other->waiter;
for (size_t i = 0; i < waiter->arg_cnt; i++) {
+ waiter->arg_vec[i].val.ch->nwaiters--;
dlist_remove(&waiter->arg_vec[i].val.ch->waiters, &waiter->arg_vec[i]);
if (&waiter->arg_vec[i].val == other)
waiter->ret = i;
@@ -125,6 +126,7 @@ size_t cr_select_v(size_t arg_cnt, struct _cr_select_arg_list_node arg_vec[]) {
};
for (size_t i = 0; i < arg_cnt; i++) {
arg_vec[i].val.waiter = &waiter;
+ arg_vec[i].val.ch->nwaiters++;
dlist_push_to_rear(&arg_vec[i].val.ch->waiters, &arg_vec[i]);
}
cr_pause_and_yield();
diff --git a/libcr_ipc/include/libcr_ipc/chan.h b/libcr_ipc/include/libcr_ipc/chan.h
index 79be220..853b4ad 100644
--- a/libcr_ipc/include/libcr_ipc/chan.h
+++ b/libcr_ipc/include/libcr_ipc/chan.h
@@ -97,9 +97,25 @@
(CH)->core.waiters.front->val.op == _CR_SELECT_OP_SEND); \
})
+/**
+ * cr_chan_num_waiters(ch) returns the number of coroutines currently
+ * blocked on the channel.
+ *
+ * @runs_in coroutine
+ * @cr_pauses never
+ * @cr_yields never
+ *
+ * size_t cr_chan_num_waiters(NAME##_t *ch);
+ */
+#define cr_chan_num_waiters(CH) ({ \
+ cr_assert_in_coroutine(); \
+ ((CH)->core.nwaiters); \
+})
+
DLIST_DECLARE(_cr_select_arg_list);
struct _cr_chan {
struct _cr_select_arg_list waiters;
+ size_t nwaiters;
};
/* cr_select arguments ********************************************************/