diff options
Diffstat (limited to 'libcr_ipc/include')
-rw-r--r-- | libcr_ipc/include/libcr_ipc/sema.h | 9 |
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_ */ |