summaryrefslogtreecommitdiff
path: root/libcr_ipc/include
diff options
context:
space:
mode:
Diffstat (limited to 'libcr_ipc/include')
-rw-r--r--libcr_ipc/include/libcr_ipc/sema.h9
1 files changed, 4 insertions, 5 deletions
diff --git a/libcr_ipc/include/libcr_ipc/sema.h b/libcr_ipc/include/libcr_ipc/sema.h
index 9958364..0895a22 100644
--- a/libcr_ipc/include/libcr_ipc/sema.h
+++ b/libcr_ipc/include/libcr_ipc/sema.h
@@ -38,14 +38,14 @@ typedef struct {
static inline void cr_sema_signal(cr_sema_t *sema) {
assert(sema);
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
sema->cnt++;
if (sema->waiters.front) {
sema->cnt--;
cr_unpause(sema->waiters.front->cid);
_cr_ipc_sll_pop_from_front(&sema->waiters);
}
- cr_enable_interrupts();
+ cr_restore_interrupts(saved);
}
/**
@@ -74,18 +74,17 @@ static inline void cr_sema_signal_from_intrhandler(cr_sema_t *sema) {
static inline void cr_sema_wait(cr_sema_t *sema) {
assert(sema);
- cr_disable_interrupts();
+ bool saved = cr_save_and_disable_interrupts();
if (sema->cnt) { /* non-blocking */
sema->cnt--;
- cr_enable_interrupts();
} else { /* blocking */
struct _cr_sema_waiter self = {
.cid = cr_getcid(),
};
_cr_ipc_sll_push_to_rear(&sema->waiters, &self);
- cr_enable_interrupts();
cr_pause_and_yield();
}
+ cr_restore_interrupts(saved);
}
#endif /* _LIBCR_IPC_SEMA_H_ */