diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 43bf12f5e8..0344f6005f 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -322,14 +322,14 @@ impl UserInner { let mut preempt = PreemptGuardL1::new(¤t_context, &mut token); let token = preempt.token(); - self.todo.send( + self.todo.send_locked( Sqe { opcode: Opcode::Cancel as u8, sqe_flags: SqeFlags::ONEWAY, tag: sqe.tag, ..Default::default() }, - token, + &mut token.token(), ); event::trigger(self.root_id, self.scheme_id.get(), EVENT_READ, token); diff --git a/src/sync/wait_condition.rs b/src/sync/wait_condition.rs index ce56ca7bb1..d37c040cfc 100644 --- a/src/sync/wait_condition.rs +++ b/src/sync/wait_condition.rs @@ -7,12 +7,12 @@ use alloc::{ use crate::{ context::{self, ContextLock, PreemptGuard}, - sync::{CleanLockToken, Mutex, L1}, + sync::{CleanLockToken, LockToken, Mutex, L1, L2}, }; #[derive(Debug)] pub struct WaitCondition { - contexts: Mutex>>, + contexts: Mutex>>, } impl WaitCondition { @@ -24,6 +24,10 @@ impl WaitCondition { // Notify all waiters pub fn notify(&self, token: &mut CleanLockToken) -> usize { + self.notify_locked(&mut token.token().downgrade()) + } + + pub fn notify_locked<'a>(&self, token: &'a mut LockToken<'a, L1>) -> usize { let mut contexts = self.contexts.lock(token.token()); let (contexts, mut token) = contexts.token_split(); let len = contexts.len(); diff --git a/src/sync/wait_queue.rs b/src/sync/wait_queue.rs index a997109111..73d8f08620 100644 --- a/src/sync/wait_queue.rs +++ b/src/sync/wait_queue.rs @@ -3,7 +3,7 @@ use spin::Mutex; use syscall::{EAGAIN, EINTR}; use crate::{ - sync::{CleanLockToken, WaitCondition}, + sync::{CleanLockToken, LockToken, WaitCondition, L1}, syscall::{ error::{Error, Result, EINVAL}, usercopy::UserSliceWo, @@ -73,12 +73,16 @@ impl WaitQueue { } pub fn send(&self, value: T, token: &mut CleanLockToken) -> usize { + self.send_locked(value, &mut token.token().downgrade()) + } + + pub fn send_locked<'a>(&self, value: T, token: &'a mut LockToken<'a, L1>) -> usize { let len = { let mut inner = self.inner.lock(); inner.push_back(value); inner.len() }; - self.condition.notify(token); + self.condition.notify_locked(token); len } }