summaryrefslogtreecommitdiff
path: root/kern/condition.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/condition.c
parentd28cd672a56342e4dcdbb51fe63a13e61eeefdd4 (diff)
kern/sleepq: also disable interrupts during critical sections
Diffstat (limited to 'kern/condition.c')
-rw-r--r--kern/condition.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/kern/condition.c b/kern/condition.c
index 7440fa36..4a837f4e 100644
--- a/kern/condition.c
+++ b/kern/condition.c
@@ -73,6 +73,7 @@ condition_wait(struct condition *condition, struct mutex *mutex)
{
struct condition *last_cond;
struct sleepq *sleepq;
+ unsigned long flags;
mutex_assert_locked(mutex);
@@ -94,7 +95,7 @@ condition_wait(struct condition *condition, struct mutex *mutex)
*/
last_cond = thread_pull_last_cond();
- sleepq = sleepq_lend(condition, true);
+ sleepq = sleepq_lend(condition, true, &flags);
mutex_unlock(mutex);
@@ -114,7 +115,7 @@ condition_wait(struct condition *condition, struct mutex *mutex)
thread_set_last_cond(condition);
}
- sleepq_return(sleepq);
+ sleepq_return(sleepq, flags);
mutex_lock(mutex);
}
@@ -123,8 +124,9 @@ void
condition_signal(struct condition *condition)
{
struct sleepq *sleepq;
+ unsigned long flags;
- sleepq = sleepq_acquire(condition, true);
+ sleepq = sleepq_acquire(condition, true, &flags);
if (sleepq == NULL) {
return;
@@ -140,15 +142,16 @@ condition_signal(struct condition *condition)
condition_inc_nr_pending_waiters(condition);
out:
- sleepq_release(sleepq);
+ sleepq_release(sleepq, flags);
}
void
condition_broadcast(struct condition *condition)
{
struct sleepq *sleepq;
+ unsigned long flags;
- sleepq = sleepq_acquire(condition, true);
+ sleepq = sleepq_acquire(condition, true, &flags);
if (sleepq == NULL) {
return;
@@ -163,15 +166,16 @@ condition_broadcast(struct condition *condition)
condition_move_waiters(condition);
out:
- sleepq_release(sleepq);
+ sleepq_release(sleepq, flags);
}
void
condition_wakeup(struct condition *condition)
{
struct sleepq *sleepq;
+ unsigned long flags;
- sleepq = sleepq_acquire(condition, true);
+ sleepq = sleepq_acquire(condition, true, &flags);
if (sleepq == NULL) {
return;
@@ -189,5 +193,5 @@ condition_wakeup(struct condition *condition)
sleepq_signal(sleepq);
out:
- sleepq_release(sleepq);
+ sleepq_release(sleepq, flags);
}