fix various bugs

This commit is contained in:
rsc 2007-08-08 08:57:37 +00:00
parent bda5186c0d
commit 00d0f794cf
2 changed files with 9 additions and 14 deletions

12
BUGS
View file

@ -12,15 +12,6 @@ main.c:
cpus[0] -> cpus[bcpu] cpus[0] -> cpus[bcpu]
proc.c: proc.c:
comment at top of scheduler() should say
via longjmp back to the scheduler
not
via longjmp back to the top of scheduler
sched should panic if state == RUNNING.
forkret comment should say "Return" not "return"
as a consequence of the implementation of proc_kill, as a consequence of the implementation of proc_kill,
any loop calling sleep should check for p->killed any loop calling sleep should check for p->killed
and be able to break out with an error return. and be able to break out with an error return.
@ -28,9 +19,6 @@ proc.c:
can swap procdump up after proc_kill can swap procdump up after proc_kill
and then have proc_exit and proc_wait on same sheet and then have proc_exit and proc_wait on same sheet
proc_exit should wake up proc[1] if any
reparenting was done.
sched -> switch2scheduler? or just switch? sched -> switch2scheduler? or just switch?
factor out switching and scheduling code from process code factor out switching and scheduling code from process code

11
proc.c
View file

@ -207,8 +207,10 @@ sched(void)
{ {
struct proc *p = curproc[cpu()]; struct proc *p = curproc[cpu()];
if(p->state == RUNNING)
panic("sched running");
if(!holding(&proc_table_lock)) if(!holding(&proc_table_lock))
panic("sched"); panic("sched proc_table_lock");
if(cpus[cpu()].nlock != 1) if(cpus[cpu()].nlock != 1)
panic("sched locks"); panic("sched locks");
@ -334,6 +336,9 @@ proc_exit(void)
struct proc *cp = curproc[cpu()]; struct proc *cp = curproc[cpu()];
int fd; int fd;
if(cp->pid == 1)
panic("init exiting");
// Close all open files. // Close all open files.
for(fd = 0; fd < NOFILE; fd++){ for(fd = 0; fd < NOFILE; fd++){
if(cp->ofile[fd]){ if(cp->ofile[fd]){
@ -354,8 +359,10 @@ proc_exit(void)
// Reparent our children to process 1. // Reparent our children to process 1.
for(p = proc; p < &proc[NPROC]; p++) for(p = proc; p < &proc[NPROC]; p++)
if(p->ppid == cp->pid) if(p->ppid == cp->pid){
p->ppid = 1; p->ppid = 1;
wakeup1(&proc[1]); // init
}
// Jump into the scheduler, never to return. // Jump into the scheduler, never to return.
cp->killed = 0; cp->killed = 0;