diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-08 08:28:16 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-12-08 08:28:16 -0700 |
commit | 96a751d8a5d20b2acea5ae8d10ac3d051466c2c3 (patch) | |
tree | 1ce291df34d78acd6f1619a779abbd4f06134e26 /libcr_ipc | |
parent | afe6542b30def82573e070371281c05dc593a739 (diff) | |
parent | b9ebe41358244caa9334e72ca4e3c8c7a14c86e7 (diff) |
Merge commit 'b9ebe41358244caa9334e72ca4e3c8c7a14c86e7'
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); } |