diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-03 09:09:25 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-08 08:27:23 -0700 |
commit | 275afbe4f2fb37c431dece96ab1152e213d9624a (patch) | |
tree | 6c0fb303ec3981b36937eefb568623ff9aa28ecd /libcr_ipc | |
parent | 92c0baf72135a3ad3c396d0897e8741fc552e490 (diff) |
libcr_ipc: sema: Only decrement from waiters
Diffstat (limited to 'libcr_ipc')
-rw-r--r-- | libcr_ipc/include/libcr_ipc/sema.h | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/libcr_ipc/include/libcr_ipc/sema.h b/libcr_ipc/include/libcr_ipc/sema.h index 157c196..db840fe 100644 --- a/libcr_ipc/include/libcr_ipc/sema.h +++ b/libcr_ipc/include/libcr_ipc/sema.h @@ -39,7 +39,6 @@ static inline void cr_sema_signal(cr_sema_t *sema) { bool saved = cr_save_and_disable_interrupts(); sema->cnt++; if (sema->waiters.front) { - sema->cnt--; cr_unpause( _cr_ipc_sll_node_cast(struct _cr_sema_waiter, sema->waiters.front)->cid); _cr_ipc_sll_pop_from_front(&sema->waiters); @@ -57,7 +56,6 @@ static inline void cr_sema_signal_from_intrhandler(cr_sema_t *sema) { sema->cnt++; if (sema->waiters.front) { - sema->cnt--; cr_unpause_from_intrhandler( _cr_ipc_sll_node_cast(struct _cr_sema_waiter, sema->waiters.front)->cid); _cr_ipc_sll_pop_from_front(&sema->waiters); @@ -75,15 +73,15 @@ static inline void cr_sema_wait(cr_sema_t *sema) { assert(sema); bool saved = cr_save_and_disable_interrupts(); - if (sema->cnt) { /* non-blocking */ - sema->cnt--; - } else { /* blocking */ + if (!sema->cnt) { struct _cr_sema_waiter self = { .cid = cr_getcid(), }; _cr_ipc_sll_push_to_rear(&sema->waiters, &self); cr_pause_and_yield(); } + assert(sema->cnt); + sema->cnt--; cr_restore_interrupts(saved); } |