summaryrefslogtreecommitdiff
path: root/libcr_ipc
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-11-15 00:46:44 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-11-19 20:15:48 -0700
commit5e04cdf350f9cede59263b52c2271f7c066439e3 (patch)
tree9d731c522a5a6d7b1bd49293f0350da1f4e2bd47 /libcr_ipc
parent712f71f1a7c6d06ce9f8f011c5d5c03add0e9d72 (diff)
libcr: Begone with PRE_RUNNABLE
Diffstat (limited to 'libcr_ipc')
-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_ */