summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}