diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-11-15 00:46:44 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-11-19 20:15:48 -0700 |
commit | 5e04cdf350f9cede59263b52c2271f7c066439e3 (patch) | |
tree | 9d731c522a5a6d7b1bd49293f0350da1f4e2bd47 /libcr_ipc | |
parent | 712f71f1a7c6d06ce9f8f011c5d5c03add0e9d72 (diff) |
libcr: Begone with PRE_RUNNABLE
Diffstat (limited to 'libcr_ipc')
-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_ */ |