1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-22 16:16:16 +04:00

fix bug of Condvar::notify: remove from queue when wake up

This commit is contained in:
function2-llx 2020-05-15 21:11:52 +08:00
parent 1c8d522ce6
commit 6253d80e1d
4 changed files with 26 additions and 10 deletions

View File

@ -1,11 +1,14 @@
// currently support x86_64 only // currently support x86_64 only
// copy from fcntl.h // copy from fcntl.h
pub const F_DUPFD: usize = 0; /* dup */ pub const F_DUPFD: usize = 0; /* dup */
pub const F_GETFD: usize = 1; /* get close_on_exec */ pub const F_GETFD: usize = 1; /* get close_on_exec */
pub const F_SETFD: usize = 2; /* set/clear close_on_exec */ pub const F_SETFD: usize = 2; /* set/clear close_on_exec */
pub const F_GETFL: usize = 3; /* get file->f_flags */ pub const F_GETFL: usize = 3; /* get file->f_flags */
pub const F_SETFL: usize = 4; /* set file->f_flags */ pub const F_SETFL: usize = 4; /* set file->f_flags */
pub const F_GETLK: usize = 5; /* Get record locking info. */
pub const F_SETLK: usize = 6; /* Set record locking info (non-blocking). */
pub const F_SETLKW: usize = 7; /* Set record locking info (blocking). */
const F_LINUX_SPECIFIC_BASE: usize = 1024; const F_LINUX_SPECIFIC_BASE: usize = 1024;

View File

@ -142,32 +142,40 @@ impl Condvar {
} }
pub fn notify_one(&self) { pub fn notify_one(&self) {
if let Some(t) = self.wait_queue.lock().front() { let mut queue = self.wait_queue.lock();
if let Some(t) = queue.front() {
self.epoll_callback(t); self.epoll_callback(t);
t.unpark(); t.unpark();
queue.pop_front();
} }
} }
pub fn notify_all(&self) { pub fn notify_all(&self) {
let queue = self.wait_queue.lock(); let mut queue = self.wait_queue.lock();
for t in queue.iter() { for t in queue.iter() {
self.epoll_callback(t); self.epoll_callback(t);
t.unpark(); t.unpark();
} }
queue.clear();
} }
/// Notify up to `n` waiters. /// Notify up to `n` waiters.
/// Return the number of waiters that were woken up. /// Return the number of waiters that were woken up.
pub fn notify_n(&self, n: usize) -> usize { pub fn notify_n(&self, n: usize) -> usize {
let mut count = 0; let mut count = 0;
let queue = self.wait_queue.lock(); let mut queue = self.wait_queue.lock();
for t in queue.iter() { for t in queue.iter() {
if count >= n { if count >= n {
break; break;
} }
self.epoll_callback(t);
t.unpark(); t.unpark();
count += 1; count += 1;
} }
for _ in 0..count {
queue.pop_front();
}
count count
} }

View File

@ -58,6 +58,11 @@ impl Syscall<'_> {
Ok(0) Ok(0)
} }
pub fn sys_tkill(&mut self, tgid: i32, tid: i32, sig: i32) -> SysResult {
info!("tkill: [{}] tgid: {}, tid: {}, sig: {}", thread::current().id(), tgid, tid, sig);
self.unimplemented("tkill", Ok(0))
}
pub fn sys_futex( pub fn sys_futex(
&mut self, &mut self,
uaddr: usize, uaddr: usize,

View File

@ -283,7 +283,7 @@ impl Syscall<'_> {
args[2] as i32, args[2] as i32,
args[3] as *const TimeSpec, args[3] as *const TimeSpec,
), ),
SYS_TKILL => self.unimplemented("tkill", Ok(0)), SYS_TKILL => self.sys_tkill(args[0] as i32, args[1] as i32, args[2] as i32),
// time // time
SYS_NANOSLEEP => self.sys_nanosleep(args[0] as *const TimeSpec), SYS_NANOSLEEP => self.sys_nanosleep(args[0] as *const TimeSpec),