From 954db4c99892646f58528fcb7ef21aabb3ac6cdb Mon Sep 17 00:00:00 2001 From: Garen Tyler Date: Fri, 3 Nov 2023 21:11:07 -0600 Subject: [PATCH] wakeup --- kernel/defs.h | 1 - kernel/proc.c | 17 ----------------- kernel/rustkernel/src/proc/process.rs | 3 +++ kernel/rustkernel/src/proc/scheduler.rs | 16 +++++++++++++++- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/kernel/defs.h b/kernel/defs.h index b9ea516..f388bd4 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -87,7 +87,6 @@ struct proc *myproc(); void procinit(void); void sleep_lock(void *, struct spinlock *); void userinit(void); -void wakeup(void *); int either_copyout(int user_dst, uint64 dst, void *src, uint64 len); int either_copyin(void *dst, int user_src, uint64 src, uint64 len); void procdump(void); diff --git a/kernel/proc.c b/kernel/proc.c index b93b14b..04902d2 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -129,23 +129,6 @@ forkret(void) // Reacquires lock when awakened. void sleep_lock(void *chan, struct spinlock *lk); -// Wake up all processes sleeping on chan. -// Must be called without any p->lock. -void wakeup(void *chan) -{ - struct proc *p; - - for(p = proc; p < &proc[NPROC]; p++) { - if(p != myproc()){ - acquire(&p->lock); - if(p->state == SLEEPING && p->chan == chan) { - p->state = RUNNABLE; - } - release(&p->lock); - } - } -} - // Copy to either a user address, or kernel address, // depending on usr_dst. // Returns 0 on success, -1 on error. diff --git a/kernel/rustkernel/src/proc/process.rs b/kernel/rustkernel/src/proc/process.rs index 6f40cad..6fe6e5f 100644 --- a/kernel/rustkernel/src/proc/process.rs +++ b/kernel/rustkernel/src/proc/process.rs @@ -146,6 +146,9 @@ impl Process { unsafe { Some(&mut *p) } } } + pub fn is_current(&self) -> bool { + addr_of!(*self).cast_mut() == Cpu::current().proc + } pub fn alloc_pid() -> i32 { NEXT_PID.fetch_add(1, Ordering::SeqCst) diff --git a/kernel/rustkernel/src/proc/scheduler.rs b/kernel/rustkernel/src/proc/scheduler.rs index 45f0cbc..02f93e8 100644 --- a/kernel/rustkernel/src/proc/scheduler.rs +++ b/kernel/rustkernel/src/proc/scheduler.rs @@ -13,7 +13,7 @@ use core::{ }; extern "C" { - pub fn wakeup(chan: *const c_void); + // pub fn wakeup(chan: *const c_void); // pub fn scheduler() -> !; pub fn swtch(a: *mut Context, b: *mut Context); } @@ -109,3 +109,17 @@ pub unsafe fn sleep(chan: *mut c_void) { // Tidy up. p.chan = null_mut(); } + +/// Wake up all processes sleeping on chan. +/// Must be called without any p.lock. +#[no_mangle] +pub unsafe extern "C" fn wakeup(chan: *mut c_void) { + for p in &mut proc { + if !p.is_current() { + let _guard = p.lock.lock(); + if p.state == ProcessState::Sleeping && p.chan == chan { + p.state = ProcessState::Runnable; + } + } + } +}