summaryrefslogtreecommitdiff
path: root/libcr_ipc
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-08 08:28:16 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-12-08 08:28:16 -0700
commit96a751d8a5d20b2acea5ae8d10ac3d051466c2c3 (patch)
tree1ce291df34d78acd6f1619a779abbd4f06134e26 /libcr_ipc
parentafe6542b30def82573e070371281c05dc593a739 (diff)
parentb9ebe41358244caa9334e72ca4e3c8c7a14c86e7 (diff)
Merge commit 'b9ebe41358244caa9334e72ca4e3c8c7a14c86e7'
Diffstat (limited to 'libcr_ipc')
-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);
}