summaryrefslogtreecommitdiff
path: root/kern/mutex.c
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-03-17 21:49:22 +0100
committerRichard Braun <rbraun@sceen.net>2017-03-17 21:49:22 +0100
commitd2a89f7f6e976d022527c2a5a1c75268aab8cd49 (patch)
tree9a8399ba70a8f4fa9f6a50b5f15ec5f37749882e /kern/mutex.c
parentd28cd672a56342e4dcdbb51fe63a13e61eeefdd4 (diff)
kern/sleepq: also disable interrupts during critical sections
Diffstat (limited to 'kern/mutex.c')
-rw-r--r--kern/mutex.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/kern/mutex.c b/kern/mutex.c
index b193aedb..353d94a7 100644
--- a/kern/mutex.c
+++ b/kern/mutex.c
@@ -28,9 +28,10 @@ void
mutex_lock_slow(struct mutex *mutex)
{
struct sleepq *sleepq;
+ unsigned long flags;
unsigned int state;
- sleepq = sleepq_lend(mutex, false);
+ sleepq = sleepq_lend(mutex, false, &flags);
for (;;) {
state = atomic_swap_uint(&mutex->state, MUTEX_CONTENDED);
@@ -47,15 +48,16 @@ mutex_lock_slow(struct mutex *mutex)
assert(state == MUTEX_CONTENDED);
}
- sleepq_return(sleepq);
+ sleepq_return(sleepq, flags);
}
void
mutex_unlock_slow(struct mutex *mutex)
{
struct sleepq *sleepq;
+ unsigned long flags;
- sleepq = sleepq_acquire(mutex, false);
+ sleepq = sleepq_acquire(mutex, false, &flags);
if (sleepq == NULL) {
return;
@@ -63,7 +65,7 @@ mutex_unlock_slow(struct mutex *mutex)
sleepq_signal(sleepq);
- sleepq_release(sleepq);
+ sleepq_release(sleepq, flags);
}
#endif /* X15_MUTEX_PI */