summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-03 09:09:25 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-08 08:27:23 -0700
commit275afbe4f2fb37c431dece96ab1152e213d9624a (patch)
tree6c0fb303ec3981b36937eefb568623ff9aa28ecd
parent92c0baf72135a3ad3c396d0897e8741fc552e490 (diff)
libcr_ipc: sema: Only decrement from waiters
-rw-r--r--libcr_ipc/include/libcr_ipc/sema.h8
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);
}