diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-04-16 05:21:31 -0600 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-04-16 05:27:24 -0600 |
commit | f56ae03840bb264163c4035eb72fbac938847638 (patch) | |
tree | 30008026f025696066024c8d32001cf938afb9cc /libcr_ipc | |
parent | cf102e5e0ce3dfcba0a2dbb6c3d16883e0525b41 (diff) |
lib9p_srv: Re-think Tflush semantics
Diffstat (limited to 'libcr_ipc')
-rw-r--r-- | libcr_ipc/chan.c | 2 | ||||
-rw-r--r-- | libcr_ipc/include/libcr_ipc/chan.h | 16 |
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 ********************************************************/ |