| plan 9 kernel history: overview | file list | diff list |
1991/0705/port/proc.c (diff list | history)
| 1991/0608/sys/src/9/port/proc.c:40,45 – 1991/0705/sys/src/9/port/proc.c:40,46 (short | long | prev | next) | ||
|
Add Stopped. Formatting changes, extra comments.
Lock palloc before sched to avoid race over upage (BUG FIX).
Spacing fixes. Add Proc.egrp, Proc.fgrp. Add canpage.
The Grim Reaper lays waste the bodies of the dead.
rsc Mon Mar 20 17:14:12 2006 | ||
| 1990/0227 | "Inwait", "Wakeme", "Broken", | |
| 1991/0705 | "Stopped", | |
| 1990/0227 | }; /* | |
| 1991/0608/sys/src/9/port/proc.c:49,54 – 1991/0705/sys/src/9/port/proc.c:50,56 | ||
| 1990/0227 | schedinit(void) /* never returns */ { Proc *p; | |
| 1991/0705 | Page *pg; | |
| 1990/0227 | setlabel(&m->sched); if(u){ | |
| 1991/0608/sys/src/9/port/proc.c:58,73 – 1991/0705/sys/src/9/port/proc.c:60,97 | ||
| 1990/0227 | u = 0; if(p->state == Running) ready(p); | |
| 1991/0705 | else if(p->state == Moribund) { /* * The Grim Reaper lays waste the bodies of the dead */ | |
| 1990/0227 | p->pid = 0; | |
| 1991/0507 | mmurelease(p); | |
| 1990/0227 |
| |
| 1991/0705 | /* * Holding locks: * procalloc, debug, palloc */ pg = p->upage; pg->ref = 0; p->upage = 0; palloc.freecount++; if(palloc.head) { pg->next = palloc.head; palloc.head->prev = pg; pg->prev = 0; palloc.head = pg; } else { palloc.head = palloc.tail = pg; pg->prev = pg->next = 0; } | |
| 1990/0227 | p->qnext = procalloc.free; procalloc.free = p; | |
| 1991/0430 |
| |
| 1990/0227 |
| |
| 1991/0705 | unlock(&palloc); | |
| 1991/0430 | unlock(&p->debug); | |
| 1990/0227 | unlock(&procalloc); | |
| 1991/0705 | ||
| 1990/0227 | p->state = Dead; } p->mach = 0; | |
| 1991/0608/sys/src/9/port/proc.c:78,84 – 1991/0705/sys/src/9/port/proc.c:102,108 | ||
| 1990/0227 | void sched(void) { | |
| 1991/0420 |
| |
| 1991/0705 | uchar procstate[64]; | |
| 1990/0227 | Proc *p; ulong tlbvirt, tlbphys; | |
| 1990/0731 | void (*f)(ulong, ulong); | |
| 1991/0608/sys/src/9/port/proc.c:175,180 – 1991/0705/sys/src/9/port/proc.c:199,221 | ||
| 1990/0227 | return p; } | |
| 1991/0705 | int canpage(Proc *p) { int ok = 0; splhi(); lock(&runhiq); if(p->state != Running) { p->newtlb = 1; ok = 1; } unlock(&runhiq); spllo(); return ok; } | |
| 1990/0227 | Proc* newproc(void) { | |
| 1991/0608/sys/src/9/port/proc.c:192,199 – 1991/0705/sys/src/9/port/proc.c:233,243 | ||
| 1990/0227 | p->child = 0; p->exiting = 0; | |
| 1991/0317 | p->pgrp = 0; | |
| 1991/0705 | p->egrp = 0; p->fgrp = 0; | |
| 1990/0722 | p->fpstate = FPinit; | |
| 1991/0425 | p->kp = 0; | |
| 1991/0705 | p->procctl = 0; | |
| 1990/0227 | memset(p->seg, 0, sizeof p->seg); lock(&pidalloc); p->pid = ++pidalloc.pid; | |
| 1991/0608/sys/src/9/port/proc.c:300,307 – 1991/0705/sys/src/9/port/proc.c:344,351 | ||
| 1990/0227 | p = r->p; if(p){ r->p = 0; | |
| 1991/0705 | if(p->state != Wakeme) panic("wakeup: state"); | |
| 1990/0227 | p->r = 0; ready(p); } | |
| 1991/0608/sys/src/9/port/proc.c:359,365 – 1991/0705/sys/src/9/port/proc.c:403,410 | ||
| 1991/0109 | kunmap(k); | |
| 1990/0227 | if(dolock) unlock(&p->debug); | |
| 1991/0705 | if(r = p->r) { /* assign = */ | |
| 1990/0227 | /* wake up */ s = splhi(); lock(r); | |
| 1991/0608/sys/src/9/port/proc.c:432,458 – 1991/0705/sys/src/9/port/proc.c:477,505 | ||
| 1990/0227 | { ulong mypid; | |
| 1990/03081 | Proc *p, *c, *k, *l; | |
| 1990/0227 |
| |
| 1991/0705 | int n, i; | |
| 1990/03081 | Chan *ch; | |
| 1991/0110 | char msg[ERRLEN]; | |
| 1990/0227 | ulong *up, *ucp, *wp; | |
| 1991/0110 |
| |
| 1991/0705 | if(s) /* squirrel away; we'll lose our address space */ | |
| 1991/0110 | strcpy(msg, s); else msg[0] = 0; | |
| 1991/0705 | ||
| 1990/03081 | c = u->p; | |
| 1991/0513 | c->alarm = 0; | |
| 1990/03081 | mypid = c->pid; | |
| 1991/0517 |
| |
| 1991/0705 | closefgrp(c->fgrp); | |
| 1991/0517 | ||
| 1990/0227 | if(freemem){ | |
| 1991/0705 | flushvirt(); for(i = 0; i < NSEG; i++) if(c->seg[i]) putseg(c->seg[i]); | |
| 1990/03081 | closepgrp(c->pgrp); | |
| 1991/0705 | closeegrp(c->egrp); | |
| 1990/0227 | close(u->dot); } /* | |
| 1991/0608/sys/src/9/port/proc.c:502,519 – 1991/0705/sys/src/9/port/proc.c:549,575 | ||
| 1990/0227 | out: if(!freemem){ | |
| 1990/1101 | addbroken(c); | |
| 1990/0227 |
| |
| 1991/0705 | flushvirt(); for(i = 0; i < NSEG; i++) if(c->seg[i]) putseg(c->seg[i]); | |
| 1990/03081 | closepgrp(c->pgrp); | |
| 1991/0705 | closeegrp(c->egrp); | |
| 1990/0227 | close(u->dot); } | |
| 1990/03081 | done: | |
| 1990/0227 |
| |
| 1990/03081 |
| |
| 1990/1212 |
| |
| 1991/0705 | /* * sched() cannot wait on these locks */ lock(&procalloc); lock(&c->debug); lock(&palloc); | |
| 1990/03081 | c->state = Moribund; | |
| 1990/0227 |
| |
| 1991/0705 | sched(); panic("pexit"); | |
| 1990/0227 | } ulong | |
| 1991/0608/sys/src/9/port/proc.c:568,582 – 1991/0705/sys/src/9/port/proc.c:624,637 | ||
| 1990/0227 | { | |
| 1990/0330 | int i; | |
| 1990/0227 | Proc *p; | |
| 1990/0312 |
| |
| 1990/0227 |
| |
| 1991/0705 | print("process table:\n"); | |
| 1990/0227 | for(i=0; i<conf.nproc; i++){ p = procalloc.arena+i; | |
| 1990/0312 | if(p->state != Dead){ | |
| 1990/0704 | print("%d:%s %s upc %lux %s ut %ld st %ld r %lux\n", | |
| 1990/0629 |
| |
| 1991/0705 | p->pid, p->text, p->pgrp->user, p->pc, statename[p->state], p->time[0], p->time[1], p->r); | |
| 1990/0312 | } | |
| 1990/0227 | } } | |
| 1991/0608/sys/src/9/port/proc.c:591,596 – 1991/0705/sys/src/9/port/proc.c:646,652 | ||
| 1990/0617 | User *up; KMap *k; | |
| 1990/0722 | static Pgrp *kpgrp; | |
| 1991/0705 | char *user; | |
| 1990/0227 | /* * Kernel stack | |
| 1991/0608/sys/src/9/port/proc.c:616,624 – 1991/0705/sys/src/9/port/proc.c:672,678 | ||
| 1990/0227 | * Refs */ incref(up->dot); | |
| 1991/0705 | p->fgrp = newfgrp(); | |
| 1990/0617 | kunmap(k); | |
| 1990/0227 | /* | |
| 1991/0608/sys/src/9/port/proc.c:633,645 – 1991/0705/sys/src/9/port/proc.c:687,705 | ||
| 1990/0227 | (*func)(arg); pexit(0, 1); } | |
| 1991/0705 | user = "bootes"; | |
| 1990/0722 | if(kpgrp == 0){ kpgrp = newpgrp(); | |
| 1991/0705 | strcpy(kpgrp->user, user); | |
| 1990/0722 | } p->pgrp = kpgrp; incref(kpgrp); | |
| 1991/0705 | if(u->p->pgrp->user[0] != '\0') user = u->p->pgrp->user; sprint(p->text, "%s.%.6s", name, user); | |
| 1990/0227 | p->nchild = 0; p->parent = 0; memset(p->time, 0, sizeof(p->time)); | |
| 1991/0608/sys/src/9/port/proc.c:651,654 – 1991/0705/sys/src/9/port/proc.c:711,728 | ||
| 1991/0529 | * and has to be discarded. */ | |
| 1990/0227 | flushmmu(); | |
| 1991/0705 | } void procctl(Proc *p) { switch(p->procctl) { case Proc_exitme: pexit("Killed", 1); case Proc_stopme: p->procctl = 0; p->state = Stopped; sched(); return; } | |
| 1990/0227 | } | |