semaphore: disable interrupts while lock is held

This commit is contained in:
Matheus
2023-05-04 22:45:49 -03:00
parent c30dbc7c8f
commit 26e9f370b5
+6
View File
@@ -29,6 +29,7 @@ static thread_t *get(semaphore_t *sem) {
} }
int semaphore_wait(semaphore_t *sem, bool interruptible) { int semaphore_wait(semaphore_t *sem, bool interruptible) {
bool intstate = interrupt_set(false);
int ret = 0; int ret = 0;
spinlock_acquire(&sem->lock); spinlock_acquire(&sem->lock);
@@ -40,10 +41,12 @@ int semaphore_wait(semaphore_t *sem, bool interruptible) {
} }
spinlock_release(&sem->lock); spinlock_release(&sem->lock);
interrupt_set(intstate);
return ret; return ret;
} }
void semaphore_signal(semaphore_t *sem) { void semaphore_signal(semaphore_t *sem) {
bool intstate = interrupt_set(false);
spinlock_acquire(&sem->lock); spinlock_acquire(&sem->lock);
if (++sem->i <= 0) { if (++sem->i <= 0) {
thread_t *thread = get(sem); thread_t *thread = get(sem);
@@ -51,9 +54,11 @@ void semaphore_signal(semaphore_t *sem) {
sched_wakeup(thread, 0); sched_wakeup(thread, 0);
} }
spinlock_release(&sem->lock); spinlock_release(&sem->lock);
interrupt_set(intstate);
} }
bool semaphore_test(semaphore_t *sem) { bool semaphore_test(semaphore_t *sem) {
bool intstate = interrupt_set(false);
bool ret = false; bool ret = false;
spinlock_acquire(&sem->lock); spinlock_acquire(&sem->lock);
@@ -63,5 +68,6 @@ bool semaphore_test(semaphore_t *sem) {
} }
spinlock_release(&sem->lock); spinlock_release(&sem->lock);
interrupt_set(intstate);
return ret; return ret;
} }