Re-add next locking

上级 9eb5f138
...@@ -94,6 +94,7 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout) ...@@ -94,6 +94,7 @@ 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,6 +37,7 @@ idleloop(void) ...@@ -37,6 +37,7 @@ 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?");
} else { } else {
......
...@@ -64,6 +64,7 @@ yield(void) ...@@ -64,6 +64,7 @@ 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);
} }
...@@ -72,6 +73,7 @@ yield(void) ...@@ -72,6 +73,7 @@ yield(void)
void void
forkret(void) forkret(void)
{ {
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().
...@@ -498,6 +500,7 @@ wait(void) ...@@ -498,6 +500,7 @@ wait(void)
void void
threadhelper(void (*fn)(void *), void *arg) threadhelper(void (*fn)(void *), void *arg)
{ {
release(&myproc()->lock);
mtstart(fn, myproc()); mtstart(fn, myproc());
fn(arg); fn(arg);
exit(); exit();
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论