The scheduler loop no longer needs to hold the next proc's lock

上级 66ad4934
...@@ -94,7 +94,6 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout) ...@@ -94,7 +94,6 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout)
release(&cv->lock); release(&cv->lock);
sched(); sched();
release(&myproc()->lock);
// Reacquire original lock. // Reacquire original lock.
acquire(lk); acquire(lk);
......
...@@ -37,10 +37,8 @@ idleloop(void) ...@@ -37,10 +37,8 @@ idleloop(void)
struct proc *p = schednext(); struct proc *p = schednext();
if (p) { if (p) {
acquire(&p->lock);
if (get_proc_state(p) != RUNNABLE) { if (get_proc_state(p) != RUNNABLE) {
panic("Huh?"); panic("Huh?");
release(&p->lock);
} else { } else {
if (idle[mycpu()->id]) if (idle[mycpu()->id])
idle[mycpu()->id] = 0; idle[mycpu()->id] = 0;
......
...@@ -64,7 +64,6 @@ yield(void) ...@@ -64,7 +64,6 @@ yield(void)
acquire(&myproc()->lock); //DOC: yieldlock acquire(&myproc()->lock); //DOC: yieldlock
set_proc_state(myproc(), RUNNABLE); set_proc_state(myproc(), RUNNABLE);
sched(); sched();
release(&myproc()->lock);
} }
...@@ -73,9 +72,6 @@ yield(void) ...@@ -73,9 +72,6 @@ yield(void)
void void
forkret(void) forkret(void)
{ {
// Still holding proc->lock from scheduler.
release(&myproc()->lock);
// Just for the first process. can't do it earlier // Just for the first process. can't do it earlier
// b/c file system code needs a process context // b/c file system code needs a process context
// in which to call cv_sleep(). // in which to call cv_sleep().
...@@ -527,7 +523,6 @@ wait(void) ...@@ -527,7 +523,6 @@ wait(void)
void void
threadhelper(void (*fn)(void *), void *arg) threadhelper(void (*fn)(void *), void *arg)
{ {
release(&myproc()->lock); // initially held by scheduler
mtstart(fn, myproc()); mtstart(fn, myproc());
fn(arg); fn(arg);
exit(); exit();
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论