## diffname port/proc.c 1990/0227 ## diff -e /dev/null /n/bootesdump/1990/0227/sys/src/9/mips/proc.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "errno.h" struct { Lock; ulong pid; }pidalloc; struct { Lock; Proc *arena; Proc *free; }procalloc; struct { Lock; Proc *head; Proc *tail; }runq; char *statename[]={ /* BUG: generate automatically */ "Dead", "Moribund", "Zombie", "Ready", "Scheding", "Running", "Queueing", "MMUing", "Exiting", "Inwait", "Wakeme", "Broken", }; /* * Always splhi()'ed. */ void schedinit(void) /* never returns */ { Proc *p; setlabel(&m->sched); if(u){ m->proc = 0; p = u->p; puttlbx(0, KZERO | PTEPID(0), 0); /* safety first */ u = 0; if(p->state == Running) ready(p); else if(p->state == Moribund){ p->pid = 0; unlock(&p->debug); p->upage->ref--; /* procalloc already locked */ p->qnext = procalloc.free; procalloc.free = p; p->upage = 0; unlock(&procalloc); p->state = Dead; } p->mach = 0; } sched(); } void sched(void) { Proc *p; ulong tlbvirt, tlbphys; void (*f)(ulong); if(u){ splhi(); if(setlabel(&u->p->sched)){ /* woke up */ p = u->p; p->state = Running; p->mach = m; m->proc = p; spllo(); return; } gotolabel(&m->sched); } if(f = m->intr){ /* assign = */ m->intr = 0; (*f)(m->cause); } spllo(); p = runproc(); splhi(); mapstack(p); gotolabel(&p->sched); } void ready(Proc *p) { int s; s = splhi(); lock(&runq); p->rnext = 0; if(runq.tail) runq.tail->rnext = p; else runq.head = p; runq.tail = p; p->state = Ready; unlock(&runq); splx(s); } /* * Always called spllo */ Proc* runproc(void) { Proc *p; int i; loop: while(runq.head == 0) for(i=0; i<10; i++) ; splhi(); lock(&runq); p = runq.head; if(p==0 || p->mach){ /* p->mach==0 only when process state is saved */ unlock(&runq); spllo(); goto loop; } if(p->rnext == 0) runq.tail = 0; runq.head = p->rnext; if(p->state != Ready) print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]); unlock(&runq); p->state = Scheding; spllo(); return p; } Proc* newproc(void) { Proc *p; loop: lock(&procalloc); if(p = procalloc.free){ /* assign = */ procalloc.free = p->qnext; p->state = Zombie; unlock(&procalloc); p->mach = 0; p->qnext = 0; p->nchild = 0; p->child = 0; p->exiting = 0; memset(p->pidonmach, 0, sizeof p->pidonmach); memset(p->seg, 0, sizeof p->seg); lock(&pidalloc); p->pid = ++pidalloc.pid; unlock(&pidalloc); if(p->pid == 0) panic("pidalloc"); return p; } unlock(&procalloc); print("no procs\n"); if(u == 0) panic("newproc"); alarm(1000, wakeme, u->p); sched(); goto loop; } void procinit0(void) /* bad planning - clashes with devproc.c */ { Proc *p; int i; print("procinit\n"); procalloc.free = ialloc(conf.nproc*sizeof(Proc), 0); procalloc.arena = procalloc.free; p = procalloc.free; for(i=0; iqnext = p+1; p->qnext = 0; } void sleep1(Rendez *r, int (*f)(void*), void *arg) { Proc *p; int s; /* * spl is to allow lock to be called * at interrupt time. lock is mutual exclusion */ s = splhi(); lock(r); /* * if condition happened, never mind */ if((*f)(arg)){ unlock(r); splx(s); return; } /* * now we are committed to * change state and call scheduler */ p = u->p; if(r->p) print("double sleep %d\n", r->p->pid); p->r = r; p->wokeup = 0; p->state = Wakeme; r->p = p; unlock(r); } void sleep(Rendez *r, int (*f)(void*), void *arg) { sleep1(r, f, arg); sched(); if(u->p->wokeup){ u->p->wokeup = 0; error(0, Eintr); } } void tsleep(Rendez *r, int (*f)(void*), void *arg, int ms) { Alarm *a; sleep1(r, f, arg); a = alarm(ms, twakeme, r); sched(); cancel(a); if(u->p->wokeup){ u->p->wokeup = 0; error(0, Eintr); } } void wakeup(Rendez *r) { Proc *p; int s; s = splhi(); lock(r); p = r->p; if(p){ r->p = 0; if(p->state != Wakeme) panic("wakeup: not Wakeme"); p->r = 0; ready(p); } unlock(r); splx(s); } int postnote(Proc *p, int dolock, char *n, int flag) { User *up; int s; Rendez *r; if(dolock) lock(&p->debug); up = (User*)(p->upage->pa|KZERO); if(flag!=NUser && (up->notify==0 || up->notified)) up->nnote = 0; /* force user's hand */ else if(up->nnote == NNOTE-1) return 0; strcpy(up->note[up->nnote].msg, n); up->note[up->nnote++].flag = flag; if(dolock) unlock(&p->debug); if(r = p->r){ /* assign = */ /* wake up */ s = splhi(); lock(r); if(p->r==r && r->p==p){ r->p = 0; if(p->state != Wakeme) panic("postnote wakeup: not Wakeme"); p->wokeup = 1; p->r = 0; ready(p); } unlock(r); splx(s); } return 1; } void wakeme(Alarm *a) { ready((Proc*)(a->arg)); cancel(a); } void twakeme(Alarm *a) { wakeup((Rendez*)(a->arg)); } void pexit(char *s, int freemem) { char status[64]; ulong mypid; Proc *p; Waitmsg w; int n; Chan *c; ulong *up, *ucp, *wp; mypid = u->p->pid; if(s) strcpy(status, s); else status[0] = 0; if(freemem){ freesegs(-1); closepgrp(u->p->pgrp); close(u->dot); } for(n=0; n<=u->maxfd; n++) if(c = u->fd[n]) /* assign = */ close(c); /* * Any of my children exiting? */ while(u->p->nchild){ lock(&u->p->wait.queue); if(canlock(&u->p->wait.use)){ /* no child is exiting */ u->p->exiting = 1; unlock(&u->p->wait.use); unlock(&u->p->wait.queue); break; }else{ /* must wait for child */ unlock(&u->p->wait.queue); pwait(0); } } u->p->time[TReal] = MACHP(0)->ticks - u->p->time[TReal]; /* * Tell my parent */ p = u->p->parent; if(p == 0) goto out; qlock(&p->wait); lock(&p->wait.queue); if(p->pid==u->p->parentpid && !p->exiting){ w.pid = mypid; strcpy(w.msg, status); wp = &w.time[TUser]; up = &u->p->time[TUser]; ucp = &u->p->time[TCUser]; *wp++ = (*up++ + *ucp++)*MS2HZ; *wp++ = (*up++ + *ucp )*MS2HZ; *wp = (*up )*MS2HZ; p->child = u->p; /* * Pass info through back door, to avoid huge Proc's */ p->waitmsg = (Waitmsg*)(u->p->upage->pa|(((ulong)&w)&(BY2PG-1))|KZERO); u->p->state = Exiting; if(p->state == Inwait) ready(p); unlock(&p->wait.queue); sched(); }else{ unlock(&p->wait.queue); qunlock(&p->wait); } out: if(!freemem){ u->p->state = Broken; sched(); /* until someone lets us go */ freesegs(-1); closepgrp(u->p->pgrp); close(u->dot); } lock(&procalloc); /* sched() can't do this */ lock(&u->p->debug); /* sched() can't do this */ u->p->state = Moribund; sched(); /* never returns */ } ulong pwait(Waitmsg *w) { Proc *c, *p; ulong cpid; p = u->p; again: while(canlock(&p->wait.use)){ if(p->nchild == 0){ qunlock(&p->wait); error(0, Enochild); } p->state = Inwait; qunlock(&p->wait); sched(); } lock(&p->wait.queue); /* wait until child is finished */ c = p->child; if(c == 0){ print("pwait %d\n", p->pid); p->state = Inwait; unlock(&p->wait.queue); sched(); goto again; } p->child = 0; if(w) *w = *p->waitmsg; cpid = p->waitmsg->pid; p->time[TCUser] += c->time[TUser] + c->time[TCUser]; p->time[TCSys] += c->time[TSys] + c->time[TCSys]; p->time[TCReal] += c->time[TReal]; p->nchild--; unlock(&p->wait.queue); qunlock(&p->wait); ready(c); return cpid; } Proc* proctab(int i) { return &procalloc.arena[i]; } #include DEBUG() { int i; Proc *p; print("DEBUG\n"); for(i=0; istate != Dead) print("%d:%s upc %lux %s ut %ld st %ld\n", p->pid, p->text, p->pc, statename[p->state], p->time[0], p->time[1]); } } void kproc(char *name, void (*func)(void *), void *arg) { Proc *p; int n; ulong upa; int lastvar; /* used to compute stack address */ User *up; /* * Kernel stack */ p = newproc(); p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); upa = p->upage->pa|KZERO; up = (User *)upa; /* * Save time: only copy u-> data and useful stack */ memcpy((void*)upa, u, sizeof(User)); n = USERADDR+BY2PG - (ulong)&lastvar; n = (n+32) & ~(BY2WD-1); /* be safe & word align */ memcpy((void*)(upa+BY2PG-n), (void*)((u->p->upage->pa|KZERO)+BY2PG-n), n); ((User *)upa)->p = p; /* * Refs */ incref(up->dot); for(n=0; n<=up->maxfd; n++) up->fd[n] = 0; up->maxfd = 0; /* * Sched */ if(setlabel(&p->sched)){ u->p = p; p->state = Running; p->mach = m; m->proc = p; spllo(); strncpy(p->text, name, sizeof p->text); (*func)(arg); pexit(0, 1); } p->pgrp = u->p->pgrp; incref(p->pgrp); p->nchild = 0; p->parent = 0; memset(p->time, 0, sizeof(p->time)); p->time[TReal] = MACHP(0)->ticks; ready(p); flushmmu(); } . ## diffname port/proc.c 1990/03013 ## diff -e /n/bootesdump/1990/0227/sys/src/9/mips/proc.c /n/bootesdump/1990/03013/sys/src/9/mips/proc.c 234c print("double sleep %d %d\n", r->p->pid, p->pid); . ## diffname port/proc.c 1990/03081 ## diff -e /n/bootesdump/1990/03013/sys/src/9/mips/proc.c /n/bootesdump/1990/03081/sys/src/9/mips/proc.c 418,419c lock(&c->debug); /* sched() can't do this */ c->state = Moribund; . 416a /* * Rearrange inheritance hierarchy * 1. my children's pop is now my pop */ lock(&c->kidlock); p = c->pop; if(k = c->kid) /* assign = */ do{ k->pop = p; k = k->sib; }while(k != c->kid); /* * 2. cut me from pop's tree */ if(p == 0) /* init process only; fix pops */ goto done; lock(&p->kidlock); k = p->kid; while(k->sib != c) k = k->sib; if(k == c) p->kid = 0; else{ if(p->kid == c) p->kid = c->sib; k->sib = c->sib; } /* * 3. pass my children (pop's grandchildren) to pop */ if(k = c->kid){ /* assign = */ if(p->kid == 0) p->kid = k; else{ l = k->sib; k->sib = p->kid->sib; p->kid->sib = l; } } unlock(&p->kidlock); done: unlock(&c->kidlock); . 414c closepgrp(c->pgrp); . 411c c->state = Broken; . 399,400c p->waitmsg = (Waitmsg*)(c->upage->pa|(((ulong)&w)&(BY2PG-1))|KZERO); c->state = Exiting; . 395c p->child = c; . 390,391c up = &c->time[TUser]; ucp = &c->time[TCUser]; . 386c if(p->pid==c->parentpid && !p->exiting){ . 381c p = c->parent; . 377c c->time[TReal] = MACHP(0)->ticks - c->time[TReal]; . 372c unlock(&c->wait.queue); . 364,369c while(c->nchild){ lock(&c->wait.queue); if(canlock(&c->wait.use)){ /* no child is exiting */ c->exiting = 1; unlock(&c->wait.use); unlock(&c->wait.queue); . 359,360c if(ch = u->fd[n]) /* assign = */ close(ch); . 355c closepgrp(c->pgrp); . 348c c = u->p; mypid = c->pid; . 345c Chan *ch; . 342c Proc *p, *c, *k, *l; . 167a p->kid = 0; p->sib = 0; . ## diffname port/proc.c 1990/0309 ## diff -e /n/bootesdump/1990/03081/sys/src/9/mips/proc.c /n/bootesdump/1990/0309/sys/src/9/mips/proc.c 169a p->pop = 0; . ## diffname port/proc.c 1990/03091 ## diff -e /n/bootesdump/1990/0309/sys/src/9/mips/proc.c /n/bootesdump/1990/03091/sys/src/9/mips/proc.c 325,337d 290a void wakeme(Alarm *a) { ready((Proc*)(a->arg)); cancel(a); } void twakeme(Alarm *a) { wakeup((Rendez*)(a->arg)); } . 205a } . 204c for(i=0; iseg[j].o; if(o) print(" s%d %d %d\n", j, o->nmod, o->npte); } } . 527c if(p->state != Dead){ . 522a Orig *o; . 521c int i, j; . ## diffname port/proc.c 1990/0322 ## diff -e /n/bootesdump/1990/0312/sys/src/9/mips/proc.c /n/bootesdump/1990/0322/sys/src/9/mips/proc.c 505c unlock(&p->wait); . 493c unlock(&p->wait); . 488c lock(&p->wait); /* wait until child is finished */ . 484a unlock(&p->wait); . 480a unlock(&p->wait); . 479c while(canlock(&p->wait)){ if(p->wait.locked){ /* child is exiting; wait for him */ unlock(&p->wait); break; } . 408c unlock(&p->wait); . 405c unlock(&p->wait); . 387c lock(&p->wait); . 374c unlock(&c->wait); . 370,371c unlock(&c->wait); . 367,368c lock(&c->wait); if(c->wait.locked == 0){ /* no child is exiting */ . ## diffname port/proc.c 1990/0324 ## diff -e /n/bootesdump/1990/0322/sys/src/9/mips/proc.c /n/bootesdump/1990/0324/sys/src/9/mips/proc.c 510c unlock(&p->wait.queue); . 498c unlock(&p->wait.queue); . 493c lock(&p->wait.queue); /* wait until child is finished */ . 489d 484d 478,482c while(canlock(&p->wait.use)){ . 407c unlock(&p->wait.queue); . 404c unlock(&p->wait.queue); . 386c lock(&p->wait.queue); . 373c unlock(&c->wait.queue); . 370c unlock(&c->wait.use); unlock(&c->wait.queue); . 367,368c lock(&c->wait.queue); if(canlock(&c->wait.use)){ /* no child is exiting */ . ## diffname port/proc.c 1990/0330 ## diff -e /n/bootesdump/1990/0324/sys/src/9/mips/proc.c /n/bootesdump/1990/0330/sys/src/9/mips/proc.c 532,536d 521c int i; . ## diffname port/proc.c 1990/0424 ## diff -e /n/bootesdump/1990/0330/sys/src/9/mips/proc.c /n/bootesdump/1990/0424/sys/src/9/mips/proc.c 543a int lastvar; /* used to compute stack address */ . 542d ## diffname port/proc.c 1990/0509 ## diff -e /n/bootesdump/1990/0424/sys/src/9/mips/proc.c /n/bootesdump/1990/0509/sys/src/9/mips/proc.c 414a lock(&broken); for(b=0; bupage); upa = VA(k); up = (User*)upa; up->p = p; . 570a User *up; KMap *k; . 569d 526,527c *w = *(Waitmsg*)(p->waitmsg|VA(k)); cpid = ((Waitmsg*)(p->waitmsg|VA(k)))->pid; kunmap(k); . 524a k = kmap(c->upage); . 518d 501a KMap *k; . 401c p->waitmsg = (((ulong)&w)&(BY2PG-1)); . 317a kunmap(k); . 315a } . 314c else if(up->nnote == NNOTE-1){ kunmap(k); . 311c k = kmap(p->upage); up = (User*)VA(k); . 305a KMap *k; . ## diffname port/proc.c 1990/0619 ## diff -e /n/bootesdump/1990/0617/sys/src/9/mips/proc.c /n/bootesdump/1990/0619/sys/src/9/mips/proc.c 186a u->p->state = Wakeme; . ## diffname port/proc.c 1990/0629 ## diff -e /n/bootesdump/1990/0619/sys/src/9/mips/proc.c /n/bootesdump/1990/0629/sys/src/9/mips/proc.c 566c p->time[0], p->time[1], p->r); . 564c print("%d:%s upc %lux %s ut %ld st %ld r %lux\n", . ## diffname port/proc.c 1990/0704 ## diff -e /n/bootesdump/1990/0629/sys/src/9/mips/proc.c /n/bootesdump/1990/0704/sys/src/9/mips/proc.c 564,565c print("%d:%s %s upc %lux %s ut %ld st %ld r %lux\n", p->pid, p->text, p->pgrp->user, p->pc, statename[p->state], . ## diffname port/proc.c 1990/0722 ## diff -e /n/bootesdump/1990/0704/sys/src/9/mips/proc.c /n/bootesdump/1990/0722/sys/src/9/mips/proc.c 621,622c if(kpgrp == 0){ kpgrp = newpgrp(); strcpy(kpgrp->user, "bootes"); } p->pgrp = kpgrp; incref(kpgrp); sprint(p->text, "%s.%.6s", name, u->p->pgrp->user); . 617d 579a static Pgrp *kpgrp; . 173a p->fpstate = FPinit; . ## diffname port/proc.c 1990/0726 ## diff -e /n/bootesdump/1990/0722/sys/src/9/mips/proc.c /n/bootesdump/1990/0726/sys/src/9/mips/proc.c 301a cancel(a); . ## diffname port/proc.c 1990/0728 ## diff -e /n/bootesdump/1990/0726/sys/src/9/mips/proc.c /n/bootesdump/1990/0728/sys/src/9/mips/proc.c 302d ## diffname port/proc.c 1990/0731 ## diff -e /n/bootesdump/1990/0728/sys/src/9/mips/proc.c /n/bootesdump/1990/0731/sys/src/9/mips/proc.c 96c (*f)(m->cause, m->pc); . 80c void (*f)(ulong, ulong); . ## diffname port/proc.c 1990/0801 ## diff -e /n/bootesdump/1990/0731/sys/src/9/mips/proc.c /n/bootesdump/1990/0801/sys/src/9/mips/proc.c 61a unusepage(p->upage, 1); . ## diffname port/proc.c 1990/1101 ## diff -e /n/bootesdump/1990/0801/sys/src/9/mips/proc.c /n/bootesdump/1990/1101/sys/src/9/mips/proc.c 421,449c addbroken(c); . 346a addbroken(Proc *c) { int b; lock(&broken); if(broken.n == NBROKEN){ ready(broken.p[0]); memcpy(&broken.p[0], &broken.p[1], sizeof(Proc*)*(NBROKEN-1)); --broken.n; } broken.p[broken.n++] = c; unlock(&broken); c->state = Broken; sched(); /* until someone lets us go */ lock(&broken); for(b=0; b 0){ ready(broken.p[0]); memcpy(&broken.p[0], &broken.p[1], sizeof(Proc*)*(NBROKEN-1)); --broken.n; } unlock(&broken); return n; } void . 345a /* * weird thing: keep at most NBROKEN around */ #define NBROKEN 4 struct{ Lock; int n; Proc *p[NBROKEN]; }broken; . ## diffname port/proc.c 1990/11211 ## diff -e /n/bootesdump/1990/1101/sys/src/9/mips/proc.c /n/bootesdump/1990/11211/sys/src/9/mips/proc.c 543c error(Enochild); . 268c error(Eintr); . 253c error(Eintr); . ## diffname port/proc.c 1990/1124 ## diff -e /n/bootesdump/1990/11211/sys/src/9/mips/proc.c /n/bootesdump/1990/1124/sys/src/9/mips/proc.c 523d 480,521d 169,171d ## diffname port/proc.c 1990/1211 ## diff -e /n/bootesdump/1990/1211/sys/src/9/mips/proc.c /n/bootesdump/1990/1211/sys/src/9/port/proc.c 575a clearmmucache(); . 135c for(i=0; i<10; i++) /* keep out of shared memory for a while */ . 89a restore(p, procstate); . 84a save(procstate, sizeof(procstate)); . 78a uchar procstate[64]; /* sleeze for portability */ . 55c invalidateu(); /* safety first */ . ## diffname port/proc.c 1990/1212 ## diff -e /n/bootesdump/1990/1211/sys/src/9/port/proc.c /n/bootesdump/1990/1212/sys/src/9/port/proc.c 569a p->kp = 1; . 483a unusepage(c->upage, 1); /* sched() can't do this (it locks) */ . 92c procrestore(p, procstate); . 86c procsave(procstate, sizeof(procstate)); . 62d ## diffname port/proc.c 1990/1220 ## diff -e /n/bootesdump/1990/1212/sys/src/9/port/proc.c /n/bootesdump/1990/1220/sys/src/9/port/proc.c 538c void DEBUG(void) . ## diffname port/proc.c 1990/1227 ## diff -e /n/bootesdump/1990/1220/sys/src/9/port/proc.c /n/bootesdump/1990/1227/sys/src/9/port/proc.c 107a int anyready(void) { return runq.head != 0; } . ## diffname port/proc.c 1991/0109 ## diff -e /n/bootesdump/1990/1227/sys/src/9/port/proc.c /n/bootesdump/1991/0109/sys/src/9/port/proc.c 523,525c *w = p->waitmsg; cpid = p->waitmsg.pid; . 521d 498d 464,467d 455,457c if(s) strcpy(p->waitmsg.msg, s); else p->waitmsg.msg[0] = 0; p->waitmsg.pid = mypid; wp = &p->waitmsg.time[TUser]; . 417,420d 410d 407d 395,399c for(i=0; ip){ k = kmap(p->upage); up = (User*)VA(k); }else{ SET(k); up = u; } . ## diffname port/proc.c 1991/0110 ## diff -e /n/bootesdump/1991/0109/sys/src/9/port/proc.c /n/bootesdump/1991/0110/sys/src/9/port/proc.c 453,456c memcpy(p->waitmsg.msg, msg, ERRLEN); . 416a if(s) /* squirrel away; we'll lose our address space */ strcpy(msg, s); else msg[0] = 0; . 414a char msg[ERRLEN]; . ## diffname port/proc.c 1991/0209 ## diff -e /n/bootesdump/1991/0110/sys/src/9/port/proc.c /n/bootesdump/1991/0209/sys/src/9/port/proc.c 326d 323,324c }else . 97,100d ## diffname port/proc.c 1991/0317 ## diff -e /n/bootesdump/1991/0209/sys/src/9/port/proc.c /n/bootesdump/1991/0317/sys/src/9/port/proc.c 175a p->pgrp = 0; . ## diffname port/proc.c 1991/0318 ## diff -e /n/bootesdump/1991/0317/sys/src/9/port/proc.c /n/bootesdump/1991/0318/sys/src/9/port/proc.c 582c memmove((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); . 579c memmove(up, u, sizeof(User)); . 453c memmove(p->waitmsg.msg, msg, ERRLEN); . 383c memmove(&broken.p[b], &broken.p[b+1], sizeof(Proc*)*(NBROKEN-(b+1))); . 372c memmove(&broken.p[0], &broken.p[1], sizeof(Proc*)*(NBROKEN-1)); . ## diffname port/proc.c 1991/0420 ## diff -e /n/bootesdump/1991/0318/sys/src/9/port/proc.c /n/bootesdump/1991/0420/sys/src/9/port/proc.c 154c unlock(&runhiq); . 150,151c rq->tail = 0; rq->head = p->rnext; . 145c unlock(&runhiq); . 142,143c lock(&runhiq); if(runhiq.head) rq = &runhiq; else rq = &runloq; p = rq->head; . 138c while(runhiq.head==0 && runloq.head==0) . 133a Schedq *rq; . 124c unlock(&runhiq); . 121,122c rq->head = p; rq->tail = p; . 118,119c if(rq->tail) rq->tail->rnext = p; . 116c if(p->state == Running) rq = &runloq; else rq = &runhiq; lock(&runhiq); . 112a Schedq *rq; . 107c return runloq.head != 0 || runhiq.head != 0; . 78c uchar procstate[64]; /* sleaze for portability */ . 27a Schedq runhiq, runloq; . 26c }Schedq; . 21c typedef struct . ## diffname port/proc.c 1991/0425 ## diff -e /n/bootesdump/1991/0420/sys/src/9/port/proc.c /n/bootesdump/1991/0425/sys/src/9/port/proc.c 336a . 335c }else . 331a . 329a SET(k); USED(k); . 192a p->kp = 0; . 86a m->cs++; . ## diffname port/proc.c 1991/0430 ## diff -e /n/bootesdump/1991/0425/sys/src/9/port/proc.c /n/bootesdump/1991/0430/sys/src/9/port/proc.c 336a if(p->upage == 0) errors("noted process disappeared"); . 68a unlock(&p->debug); . 67a p->upage->ref--; . 63,64c memset(p->pidonmach, 0, sizeof p->pidonmach); . ## diffname port/proc.c 1991/0501 ## diff -e /n/bootesdump/1991/0430/sys/src/9/port/proc.c /n/bootesdump/1991/0501/sys/src/9/port/proc.c 120a . ## diffname port/proc.c 1991/0507 ## diff -e /n/bootesdump/1991/0501/sys/src/9/port/proc.c /n/bootesdump/1991/0507/sys/src/9/port/proc.c 197d 63c mmurelease(p); . ## diffname port/proc.c 1991/0513 ## diff -e /n/bootesdump/1991/0507/sys/src/9/port/proc.c /n/bootesdump/1991/0513/sys/src/9/port/proc.c 443a c->alarm = 0; . ## diffname port/proc.c 1991/0517 ## diff -e /n/bootesdump/1991/0513/sys/src/9/port/proc.c /n/bootesdump/1991/0517/sys/src/9/port/proc.c 451,453d 445a for(n=0; n<=u->maxfd; n++) if(ch = u->fd[n]) /* assign = */ close(ch); . ## diffname port/proc.c 1991/0523 ## diff -e /n/bootesdump/1991/0517/sys/src/9/port/proc.c /n/bootesdump/1991/0523/sys/src/9/port/proc.c 346a . 342c if(u == 0 || p != u->p){ . ## diffname port/proc.c 1991/0529 ## diff -e /n/bootesdump/1991/0523/sys/src/9/port/proc.c /n/bootesdump/1991/0529/sys/src/9/port/proc.c 647a /* * since the bss/data segments are now shareable, * any mmu info about this process is now stale * and has to be discarded. */ . 609c clearmmucache(); /* so child doesn't inherit any of your mappings */ . ## diffname port/proc.c 1991/0608 ## diff -e /n/bootesdump/1991/0529/sys/src/9/port/proc.c /n/bootesdump/1991/0608/sys/src/9/port/proc.c 567c procdump(void) . ## diffname port/proc.c 1991/0705 ## diff -e /n/bootesdump/1991/0608/sys/src/9/port/proc.c /n/bootesdump/1991/0705/sys/src/9/port/proc.c 653a } void procctl(Proc *p) { switch(p->procctl) { case Proc_exitme: pexit("Killed", 1); case Proc_stopme: p->procctl = 0; p->state = Stopped; sched(); return; } . 642c if(u->p->pgrp->user[0] != '\0') user = u->p->pgrp->user; sprint(p->text, "%s.%.6s", name, user); . 638c strcpy(kpgrp->user, user); . 635a user = "bootes"; . 619,621c p->fgrp = newfgrp(); . 593a char *user; . 578,579c p->pid, p->text, p->pgrp->user, p->pc, statename[p->state], p->time[0], p->time[1], p->r); . 573c print("process table:\n"); . 571d 516c sched(); panic("pexit"); . 512,514c /* * sched() cannot wait on these locks */ lock(&procalloc); lock(&c->debug); lock(&palloc); . 506a closeegrp(c->egrp); . 505c flushvirt(); for(i = 0; i < NSEG; i++) if(c->seg[i]) putseg(c->seg[i]); . 455a closeegrp(c->egrp); . 454c flushvirt(); for(i = 0; i < NSEG; i++) if(c->seg[i]) putseg(c->seg[i]); . 452d 448,450c closefgrp(c->fgrp); . 443a . 440c if(s) /* squirrel away; we'll lose our address space */ . 435c int n, i; . 362c if(r = p->r) { /* assign = */ . 303,304c if(p->state != Wakeme) panic("wakeup: state"); . 196a p->procctl = 0; . 194a p->egrp = 0; p->fgrp = 0; . 177a int canpage(Proc *p) { int ok = 0; splhi(); lock(&runhiq); if(p->state != Running) { p->newtlb = 1; ok = 1; } unlock(&runhiq); spllo(); return ok; } . 81c uchar procstate[64]; . 70a . 67,68c unlock(&palloc); . 64c /* * 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; } . 61c else if(p->state == Moribund) { /* * The Grim Reaper lays waste the bodies of the dead */ . 51a Page *pg; . 42a "Stopped", . ## diffname port/proc.c 1991/0710 ## diff -e /n/bootesdump/1991/0705/sys/src/9/port/proc.c /n/bootesdump/1991/0710/sys/src/9/port/proc.c 728a #include "errstr.h" void error(int code) { strncpy(u->error, errstrtab[code], ERRLEN); nexterror(); } void errors(char *err) { strncpy(u->error, err, ERRLEN); nexterror(); } void nexterror(void) { gotolabel(&u->errlab[--u->nerrlab]); } . ## diffname port/proc.c 1991/0712 ## diff -e /n/bootesdump/1991/0710/sys/src/9/port/proc.c /n/bootesdump/1991/0712/sys/src/9/port/proc.c 675d 502c if(c->egrp) closeegrp(c->egrp); . 494c if(c->fgrp) closefgrp(c->fgrp); . ## diffname port/proc.c 1991/0717 ## diff -e /n/bootesdump/1991/0712/sys/src/9/port/proc.c /n/bootesdump/1991/0717/sys/src/9/port/proc.c 555,557c es = &c->seg[NSEG]; for(s = c->seg; s < es; s++) if(os = *s) { *s = 0; putseg(os); } . 499,501c es = &c->seg[NSEG]; for(s = c->seg; s < es; s++) if(os = *s) { *s = 0; putseg(os); } . 485,486c if(exitstr) /* squirrel away before we lose our address space */ strcpy(msg, exitstr); . 483a Segment **s, **es, *os; . 476c pexit(char *exitstr, int freemem) . 70c * Holding locks from pexit: . ## diffname port/proc.c 1991/0720 ## diff -e /n/bootesdump/1991/0717/sys/src/9/port/proc.c /n/bootesdump/1991/0720/sys/src/9/port/proc.c 645a print("procdump: ret\n"); . 642c p->pid, p->text, p->pgrp ? p->pgrp->user : "pgrp=0", p->pc, . 637c print("process table %d:\n", conf.nproc); . ## diffname port/proc.c 1991/0721 ## diff -e /n/bootesdump/1991/0720/sys/src/9/port/proc.c /n/bootesdump/1991/0721/sys/src/9/port/proc.c 646d 637d ## diffname port/proc.c 1991/0727 ## diff -e /n/bootesdump/1991/0721/sys/src/9/port/proc.c /n/bootesdump/1991/0727/sys/src/9/port/proc.c 415d 411c if(p->r==r && r->p==p){ /* check we won the race */ . 407,408c if(r = p->r){ /* assign = */ /* wake up; can't call wakeup itself because we're racing with it */ . 399a p->notepending = 1; . 327,331c if(p->notepending == 0){ a = alarm(ms, twakeme, r); sched(); /* notepending may go true while asleep */ cancel(a); } if(p->notepending){ p->notepending = 0; . 325a p = u->p; . 324a Proc *p; . 314,316c if(p->notepending == 0) sched(); /* notepending may go true while asleep */ if(p->notepending){ p->notepending = 0; . 312a Proc *p; p = u->p; . 303,304d 300d 290c if((*f)(arg)){ p->r = 0; . 284a p = u->p; p->r = r; /* early so postnote knows */ . 240a p->notepending = 0; . ## diffname port/proc.c 1991/0805 ## diff -e /n/bootesdump/1991/0727/sys/src/9/port/proc.c /n/bootesdump/1991/0805/sys/src/9/port/proc.c 422,426c if(p->state == Wakeme){ r->p = 0; p->r = 0; ready(p); } . 340a lock(r); if(r->p == p) r->p = 0; unlock(r); . 321a lock(r); if(r->p == p) r->p = 0; unlock(r); . ## diffname port/proc.c 1991/0806 ## diff -e /n/bootesdump/1991/0805/sys/src/9/port/proc.c /n/bootesdump/1991/0806/sys/src/9/port/proc.c 438a if(p->state == Rendezvous) { lock(p->pgrp); if(p->state == Rendezvous) { p->rendval = 0; l = &REND(p->pgrp, p->rendtag); for(d = *l; d; d = d->rendhash) { if(d == p) { *l = p->rendhash; break; } l = &d->rendhash; } ready(p); } unlock(p->pgrp); } . 392a Proc *d, **l; . 43a "Rendez", . ## diffname port/proc.c 1991/0807 ## diff -e /n/bootesdump/1991/0806/sys/src/9/port/proc.c /n/bootesdump/1991/0807/sys/src/9/port/proc.c 677c p->pid, p->text, p->pgrp ? p->pgrp->user : "pgrp=0", p->pc, . 444c p->rendval = ~0; . 440a . 306a dumpstack(); } . 305c if(r->p){ . ## diffname port/proc.c 1991/0810 ## diff -e /n/bootesdump/1991/0807/sys/src/9/port/proc.c /n/bootesdump/1991/0810/sys/src/9/port/proc.c 418a if(dolock) unlock(&p->debug); . 405a } . 404c if(p->upage == 0){ if(dolock) unlock(&p->debug); . ## diffname port/proc.c 1991/0820 ## diff -e /n/bootesdump/1991/0810/sys/src/9/port/proc.c /n/bootesdump/1991/0820/sys/src/9/port/proc.c 734d 722a up->p = p; . 713d ## diffname port/proc.c 1991/0830 ## diff -e /n/bootesdump/1991/0820/sys/src/9/port/proc.c /n/bootesdump/1991/0830/sys/src/9/port/proc.c 687c statename[p->state], p->time[0], p->time[1], p->r, p->qlockpc); . 684c print("%d:%s %s upc %lux %s ut %ld st %ld r %lux qpc %lux\n", . ## diffname port/proc.c 1991/0906 ## diff -e /n/bootesdump/1991/0830/sys/src/9/port/proc.c /n/bootesdump/1991/0906/sys/src/9/port/proc.c 210c /* Only reliable way to see if we are Running */ if(p->mach == 0) { . ## diffname port/proc.c 1991/0919 ## diff -e /n/bootesdump/1991/0906/sys/src/9/port/proc.c /n/bootesdump/1991/0919/sys/src/9/port/proc.c 765a clearmmucache(); ready(p); . 759d 734a /* * use u->p instead of p, because we * don't trust the compiler, after a * gotolabel, to find the correct contents * of a local variable. Passed parameters * (func & arg) are a bit safer since we * don't play with them anywhere else. */ p = u->p; . ## diffname port/proc.c 1991/0926 ## diff -e /n/bootesdump/1991/0919/sys/src/9/port/proc.c /n/bootesdump/1991/0926/sys/src/9/port/proc.c 813a Waitq * newwaitq(void) { Waitq *wq, *e, *f; for(;;) { lock(&waitqalloc); if(wq = waitqalloc.free) { waitqalloc.free = wq->next; unlock(&waitqalloc); return wq; } unlock(&waitqalloc); wq = (Waitq*)VA(kmap(newpage(0, 0, 0))); e = &wq[(BY2PG/sizeof(Waitq))-1]; for(f = wq; f < e; f++) f->next = f+1; lock(&waitqalloc); e->next = waitqalloc.free; waitqalloc.free = wq; unlock(&waitqalloc); } } void freewaitq(Waitq *wq) { lock(&waitqalloc); wq->next = waitqalloc.free; waitqalloc.free = wq; unlock(&waitqalloc); } . 774,775d 767a ready(p); . 735,743d 708a p->psstate = 0; . 668d 656,664c memmove(w, &wq->w, sizeof(Waitmsg)); cpid = wq->w.pid; freewaitq(wq); . 646,654c unlock(&p->exl); sleep(&p->waitr, haswaitq, u->p); lock(&p->exl); wq = p->waitq; p->waitq = wq->next; p->nwait--; unlock(&p->exl); . 636,644c lock(&p->exl); if(p->nchild == 0 && p->waitq == 0) { unlock(&p->exl); error(Enochild); . 633a Waitq *wq; . 632c Proc *p; . 628a int haswaitq(void *x) { Proc *p; p = (Proc *)x; return p->waitq != 0; } . 616a flushvirt(); es = &c->seg[NSEG]; for(s = c->seg; s < es; s++) if(os = *s) { *s = 0; putseg(os); } closepgrp(c->pgrp); closeegrp(c->egrp); close(u->dot); lock(&c->exl); /* Prevent my children from leaving waits */ c->pid = 0; unlock(&c->exl); for(f = c->waitq; f; f = next) { next = f->next; freewaitq(f); } . 615c if(!freemem) addbroken(c); . 600,612c else { unlock(&p->exl); freewaitq(wq); . 577,598c lock(&p->exl); /* My parent still alive */ if(p->pid == c->parentpid && p->state != Broken && p->nwait < 128) { p->nchild--; p->time[TCUser] += c->time[TUser] + c->time[TCUser]; p->time[TCSys] += c->time[TSys] + c->time[TCSys]; wq->next = p->waitq; p->waitq = wq; p->nwait++; unlock(&p->exl); wakeup(&p->waitr); . 572,575c /* Find my parent */ . 543,570c wq = newwaitq(); wq->w.pid = c->pid; wq->w.time[TUser] = TK2MS(c->time[TUser]); wq->w.time[TCUser] = TK2MS(c->time[TCUser]); wq->w.time[TSys] = TK2MS(c->time[TSys]); wq->w.time[TCSys] = TK2MS(c->time[TCSys]); wq->w.time[TReal] = TK2MS(MACHP(0)->ticks - c->time[TReal]); if(exitstr) strncpy(wq->w.msg, exitstr, ERRLEN); else wq->w.msg[0] = '\0'; . 538d 531,535d 529a Waitq *wq, *f, *next; . 523,528c Proc *p, *c; . 494a c->psstate = 0; . 235,236c p->nwait = 0; p->waitq = 0; . 230c p->state = Scheding; p->psstate = "New"; . 38,40d 33d 20a struct { Lock; Waitq *free; }waitqalloc; . ## diffname port/proc.c 1991/1003 ## diff -e /n/bootesdump/1991/0926/sys/src/9/port/proc.c /n/bootesdump/1991/1003/sys/src/9/port/proc.c 79,89d 76,77c mmurelease(p); simpleputpage(p->upage); . 71d ## diffname port/proc.c 1991/1005 ## diff -e /n/bootesdump/1991/1003/sys/src/9/port/proc.c /n/bootesdump/1991/1005/sys/src/9/port/proc.c 537,556c if(c->kp == 0) { /* Find my parent */ p = c->parent; lock(&p->exl); /* My parent still alive */ if(p->pid == c->parentpid && p->state != Broken && p->nwait < 128) { p->nchild--; p->time[TCUser] += c->time[TUser] + c->time[TCUser]; p->time[TCSys] += c->time[TSys] + c->time[TCSys]; wq->next = p->waitq; p->waitq = wq; p->nwait++; unlock(&p->exl); wakeup(&p->waitr); } else { unlock(&p->exl); freewaitq(wq); } . ## diffname port/proc.c 1991/1006 ## diff -e /n/bootesdump/1991/1005/sys/src/9/port/proc.c /n/bootesdump/1991/1006/sys/src/9/port/proc.c 571c if(c->egrp) closeegrp(c->egrp); . 537a wq = newwaitq(); wq->w.pid = c->pid; wq->w.time[TUser] = TK2MS(c->time[TUser]); wq->w.time[TCUser] = TK2MS(c->time[TCUser]); wq->w.time[TSys] = TK2MS(c->time[TSys]); wq->w.time[TCSys] = TK2MS(c->time[TCSys]); wq->w.time[TReal] = TK2MS(MACHP(0)->ticks - c->time[TReal]); if(exitstr) strncpy(wq->w.msg, exitstr, ERRLEN); else wq->w.msg[0] = '\0'; . 525,536d ## diffname port/proc.c 1991/1007 ## diff -e /n/bootesdump/1991/1006/sys/src/9/port/proc.c /n/bootesdump/1991/1007/sys/src/9/port/proc.c 563d ## diffname port/proc.c 1991/1024 ## diff -e /n/bootesdump/1991/1007/sys/src/9/port/proc.c /n/bootesdump/1991/1024/sys/src/9/port/proc.c 569,572d 523a closepgrp(c->pgrp); close(u->dot); if(c->egrp) closeegrp(c->egrp); . ## diffname port/proc.c 1991/1105 ## diff -e /n/bootesdump/1991/1024/sys/src/9/port/proc.c /n/bootesdump/1991/1105/sys/src/9/port/proc.c 718,719c if(u->p->user[0] != '\0') user = u->p->user; . 713d 710a strcpy(p->user, user); . 652,653c p->pid, p->text, p->user, p->pc, . ## diffname port/proc.c 1991/1108 ## diff -e /n/bootesdump/1991/1105/sys/src/9/port/proc.c /n/bootesdump/1991/1108/sys/src/9/port/proc.c 743a p->psstate = state; . 741a state = p->psstate; p->psstate = "Stopped"; . 736a char *state; . ## diffname port/proc.c 1991/1109 ## diff -e /n/bootesdump/1991/1108/sys/src/9/port/proc.c /n/bootesdump/1991/1109/sys/src/9/port/proc.c 709c user = eve; . 230a p->procmode = 0644; . ## diffname port/proc.c 1991/1110 ## diff -e /n/bootesdump/1991/1109/sys/src/9/port/proc.c /n/bootesdump/1991/1110/sys/src/9/port/proc.c 747c /* free a waiting debugger */ lock(&p->debug); if(p->pdbg) { wakeup(&p->pdbg->sleep); p->pdbg = 0; } unlock(&p->debug); . 742a case Proc_traceme: if(u->nnote == 0) return; /* No break */ . 588a /* release debuggers */ if(c->pdbg) { wakeup(&c->pdbg->sleep); c->pdbg = 0; } lock(&procalloc); . 587d 244,251d 223,242c resrcwait("no procs"); . 216,221c for(;;) { lock(&procalloc); if(p = procalloc.free){ /* assign = */ procalloc.free = p->qnext; p->state = Scheding; p->psstate = "New"; unlock(&procalloc); p->mach = 0; p->qnext = 0; p->nchild = 0; p->nwait = 0; p->waitq = 0; p->pgrp = 0; p->egrp = 0; p->fgrp = 0; p->pdbg = 0; p->fpstate = FPinit; p->kp = 0; p->procctl = 0; p->notepending = 0; memset(p->seg, 0, sizeof p->seg); lock(&pidalloc); p->pid = ++pidalloc.pid; unlock(&pidalloc); if(p->pid == 0) panic("pidalloc"); return p; } . ## diffname port/proc.c 1991/1112 ## diff -e /n/bootesdump/1991/1110/sys/src/9/port/proc.c /n/bootesdump/1991/1112/sys/src/9/port/proc.c 676a p->procmode = 0644; . 184a nrdy--; . 149a nrdy++; . 98,99d 34c Schedq runhiq, runloq; int nrdy; . ## diffname port/proc.c 1991/1115 ## diff -e /n/bootesdump/1991/1112/sys/src/9/port/proc.c /n/bootesdump/1991/1115/sys/src/9/port/proc.c 402c }else . 398a SET(k); . 387,389d ## diffname port/proc.c 1991/1120 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/proc.c /n/bootesdump/1991/1120/sys/src/9/port/proc.c 453c return ret; . 414,415d 406,411c ret = 0; if(up->nnote < NNOTE){ strcpy(up->note[up->nnote].msg, n); up->note[up->nnote++].flag = flag; ret = 1; . 383c int s, ret; . ## diffname port/proc.c 1991/1127 ## diff -e /n/bootesdump/1991/1120/sys/src/9/port/proc.c /n/bootesdump/1991/1127/sys/src/9/port/proc.c 401a USED(k); . ## diffname port/proc.c 1991/1215 ## diff -e /n/bootesdump/1991/1127/sys/src/9/port/proc.c /n/bootesdump/1991/1215/sys/src/9/port/proc.c 529d 527d ## diffname port/proc.c 1991/1216 ## diff -e /n/bootesdump/1991/1215/sys/src/9/port/proc.c /n/bootesdump/1991/1216/sys/src/9/port/proc.c 755c qunlock(&p->debug); . 750c qlock(&p->debug); . 578c qlock(&c->debug); . 418c qunlock(&p->debug); . 392c qunlock(&p->debug); . 388c qlock(&p->debug); . 84c qunlock(&p->debug); . ## diffname port/proc.c 1991/1218 ## diff -e /n/bootesdump/1991/1216/sys/src/9/port/proc.c /n/bootesdump/1991/1218/sys/src/9/port/proc.c 529,531c if(exitstr && exitstr[0]){ n = sprint(wq->w.msg, "%s %d:", c->text, c->pid); strncpy(wq->w.msg+n, exitstr, ERRLEN-n); }else . 508a int n; . ## diffname port/proc.c 1992/0103 ## diff -e /n/bootesdump/1991/1218/sys/src/9/port/proc.c /n/bootesdump/1992/0103/sys/src/9/port/proc.c 685d ## diffname port/proc.c 1992/0111 ## diff -e /n/bootesdump/1992/0103/sys/src/9/port/proc.c /n/bootesdump/1992/0111/sys/src/9/port/proc.c 769c strncpy(u->error, err, ERRLEN); . 767c error(char err[]) . 6c #include "../port/error.h" . ## diffname port/proc.c 1992/0114 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/proc.c /n/bootesdump/1992/0114/sys/src/9/port/proc.c 783c char buf[ERRLEN]; sprint(buf, "no free %s", resource); error(buf); . 781c exhausted(char *resource) . 776,777c gotolabel(&u->errlab[--u->nerrlab]); . 774c nexterror(void) . 393c error(Eprocdied); . ## diffname port/proc.c 1992/0115 ## diff -e /n/bootesdump/1992/0114/sys/src/9/port/proc.c /n/bootesdump/1992/0115/sys/src/9/port/proc.c 536,537d 524c /* * if not a kernel process and have a parent, * do some housekeeping. */ if(c->kp == 0 && (p = c->parent)) { . ## diffname port/proc.c 1992/0120 ## diff -e /n/bootesdump/1992/0115/sys/src/9/port/proc.c /n/bootesdump/1992/0120/sys/src/9/port/proc.c 643d ## diffname port/proc.c 1992/0122 ## diff -e /n/bootesdump/1992/0120/sys/src/9/port/proc.c /n/bootesdump/1992/0122/sys/src/9/port/proc.c 109c procrestore(p); . 103c procsave(u->p); . 97d ## diffname port/proc.c 1992/0205 ## diff -e /n/bootesdump/1992/0122/sys/src/9/port/proc.c /n/bootesdump/1992/0205/sys/src/9/port/proc.c 543,544c p->time[TCUser] += utime; p->time[TCSys] += stime; . 530,531c utime = c->time[TUser] + c->time[TCUser]; stime = c->time[TSys] + c->time[TCSys]; wq->w.time[TUser] = TK2MS(utime); wq->w.time[TSys] = TK2MS(stime); . 508a long utime, stime; . ## diffname port/proc.c 1992/0301 ## diff -e /n/bootesdump/1992/0205/sys/src/9/port/proc.c /n/bootesdump/1992/0301/sys/src/9/port/proc.c 68,70d ## diffname port/proc.c 1992/0303 ## diff -e /n/bootesdump/1992/0301/sys/src/9/port/proc.c /n/bootesdump/1992/0303/sys/src/9/port/proc.c 525c if(c->kp == 0) { if((p = c->parent) == 0) panic("boot process died"); . ## diffname port/proc.c 1992/0309 ## diff -e /n/bootesdump/1992/0303/sys/src/9/port/proc.c /n/bootesdump/1992/0309/sys/src/9/port/proc.c 634c cpid = atoi(wq->w.pid); . 543c /* My parent still alive, processes are limited to 128 Zombies to * prevent badly written daemon consuming all the wait records */ . 533,535c readnum(0, &wq->w.time[TUser*12], NUMSIZE, TK2MS(utime), NUMSIZE); readnum(0, &wq->w.time[TSys*12], NUMSIZE, TK2MS(stime), NUMSIZE); readnum(0, &wq->w.time[TReal*12], NUMSIZE, TK2MS(MACHP(0)->ticks - c->time[TReal]), NUMSIZE); . 530c readnum(0, wq->w.pid, NUMSIZE, c->pid, NUMSIZE); . 451d 234,236c p->pid = incref(&pidalloc); . 37c char *statename[] = { /* BUG: generate automatically */ . 8,12c Ref pidalloc; . ## diffname port/proc.c 1992/0319 ## diff -e /n/bootesdump/1992/0309/sys/src/9/port/proc.c /n/bootesdump/1992/0319/sys/src/9/port/proc.c 349a if((p->sched.pc&KZERO) != KZERO){ spllo(); panic("wakeup"); } . ## diffname port/proc.c 1992/0321 ## diff -e /n/bootesdump/1992/0319/sys/src/9/port/proc.c /n/bootesdump/1992/0321/sys/src/9/port/proc.c 2c #include "../port/lib.h" . ## diffname port/proc.c 1992/0328 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/proc.c /n/bootesdump/1992/0328/sys/src/9/port/proc.c 643a if((i < 0) || (i >= conf.nproc)) panic("proctab(%d)\n", i); . ## diffname port/proc.c 1992/0428 ## diff -e /n/bootesdump/1992/0328/sys/src/9/port/proc.c /n/bootesdump/1992/0428/sys/src/9/port/proc.c 232c p->noteid = incref(¬eidalloc); if(p->pid==0 || p->noteid==0) . 8a Ref noteidalloc; . ## diffname port/proc.c 1992/0519 ## diff -e /n/bootesdump/1992/0428/sys/src/9/port/proc.c /n/bootesdump/1992/0519/sys/src/9/port/proc.c 333a splx(s); . 329a s = splhi(); . 319a int s; . 310a splx(s); . 306a s = splhi(); . 299a int s; . ## diffname port/proc.c 1992/0520 ## diff -e /n/bootesdump/1992/0519/sys/src/9/port/proc.c /n/bootesdump/1992/0520/sys/src/9/port/proc.c 826a return 0; /* not reached */ . 240a return 0; /* not reached */ . ## diffname port/proc.c 1992/0527 ## diff -e /n/bootesdump/1992/0520/sys/src/9/port/proc.c /n/bootesdump/1992/0527/sys/src/9/port/proc.c 397c return 0; . ## diffname port/proc.c 1992/0602 ## diff -e /n/bootesdump/1992/0527/sys/src/9/port/proc.c /n/bootesdump/1992/0602/sys/src/9/port/proc.c 367,379d 359,362d 333,342c p->trend = r; p->twhen = when; p->tlink = *i; *i = p; unlock(&talarm); sleep(r, fn, arg); p->twhen = 0; . 327,331c when = MS2TK(ms)+MACHP(0)->ticks; i = &talarm.list; lock(&talarm); l = &talarm.list; for(f = talarm.list; f; f = f->tlink) { if(f == p) *l = p->tlink; if(f->twhen && f->twhen < when) i = &f->tlink; l = &f->tlink; . 322,324c ulong when; Proc *p, *f, **l, **i; . 320c tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms) . ## diffname port/proc.c 1992/0603 ## diff -e /n/bootesdump/1992/0602/sys/src/9/port/proc.c /n/bootesdump/1992/0603/sys/src/9/port/proc.c 184d 173d 159a spllo(); . 150c * Always called splhi . 111d 109d ## diffname port/proc.c 1992/0604 ## diff -e /n/bootesdump/1992/0603/sys/src/9/port/proc.c /n/bootesdump/1992/0604/sys/src/9/port/proc.c 766c error(char *err) . ## diffname port/proc.c 1992/0609 ## diff -e /n/bootesdump/1992/0604/sys/src/9/port/proc.c /n/bootesdump/1992/0609/sys/src/9/port/proc.c 757c sched(); /* sched returns spllo() */ splhi(); . 739a spllo(); /* pexit has locks in it */ . 732a /* * called splhi() by notify(). See comment in notify for the * reasoning. */ . ## diffname port/proc.c 1992/0617 ## diff -e /n/bootesdump/1992/0609/sys/src/9/port/proc.c /n/bootesdump/1992/0617/sys/src/9/port/proc.c 341c sleep(r, tfn, arg); . 337a p->tfn = fn; . 315a int tfn(void *arg) { Proc *p; p = u->p; return MACHP(0)->ticks >= p->twhen || (*p->tfn)(arg); } . ## diffname port/proc.c 1992/0619 ## diff -e /n/bootesdump/1992/0617/sys/src/9/port/proc.c /n/bootesdump/1992/0619/sys/src/9/port/proc.c 247c procalloc.free = xalloc(conf.nproc*sizeof(Proc)); . 65c else if(p->state == Moribund) { . ## diffname port/proc.c 1992/0620 ## diff -e /n/bootesdump/1992/0619/sys/src/9/port/proc.c /n/bootesdump/1992/0620/sys/src/9/port/proc.c 802,837d 760a . 756a . 663c statename[p->state], p->time[0], p->time[1], p->r, p->qlockpc); . 647,648d 640c free(wq); . 583c free(f); . 563c free(wq); . 548c * prevent a badly written daemon lots of wait records */ . 530c wq = smalloc(sizeof(Waitq)); . 402d 82,83d 67a p->state = Dead; . ## diffname port/proc.c 1992/0622 ## diff -e /n/bootesdump/1992/0620/sys/src/9/port/proc.c /n/bootesdump/1992/0622/sys/src/9/port/proc.c 162a . 160,161c ; . ## diffname port/proc.c 1992/0701 ## diff -e /n/bootesdump/1992/0622/sys/src/9/port/proc.c /n/bootesdump/1992/0701/sys/src/9/port/proc.c 348c p->tlink = *l; *l = p; . 346d 337,341c for(f = *l; f; f = f->tlink) { if(f->twhen >= when) break; . 335a /* take out of list if checkalarm didn't */ if(p->trend) { l = &talarm.list; for(f = *l; f; f = f->tlink) { if(f == p) { *l = p->tlink; break; } l = &f->tlink; } } /* insert in increasing time order */ . 333d 329c Proc *p, *f, **l; . ## diffname port/proc.c 1992/0703 ## diff -e /n/bootesdump/1992/0701/sys/src/9/port/proc.c /n/bootesdump/1992/0703/sys/src/9/port/proc.c 736c strcpy(p->text, name); . 685a int lastvar; /* used to compute stack address */ . 681d ## diffname port/proc.c 1992/0711 ## diff -e /n/bootesdump/1992/0703/sys/src/9/port/proc.c /n/bootesdump/1992/0711/sys/src/9/port/proc.c 734,735d 155d 55d ## diffname port/proc.c 1992/0805 ## diff -e /n/bootesdump/1992/0711/sys/src/9/port/proc.c /n/bootesdump/1992/0805/sys/src/9/port/proc.c 667,668c s, statename[p->state], p->time[0], p->time[1], p->r, p->qlockpc, bss); . 665c bss = 0; if(p->seg[BSEG]) bss = p->seg[BSEG]->top; s = p->psstate; if(s == 0) s = "kproc"; print("%3d:%10s %10s pc %8lux %8s (%s) ut %ld st %ld r %lux qpc %lux bss %lux\n", . 660a ulong bss; . 659a char *s; . 535a poperror(); . 534c while(waserror()) ; . ## diffname port/proc.c 1992/0902 ## diff -e /n/bootesdump/1992/0805/sys/src/9/port/proc.c /n/bootesdump/1992/0902/sys/src/9/port/proc.c 532,533c if((p = c->parent) == 0) { if(exitstr == 0) exitstr = "unknown"; panic("boot process died: %s", exitstr); } . ## diffname port/proc.c 1992/0909 ## diff -e /n/bootesdump/1992/0902/sys/src/9/port/proc.c /n/bootesdump/1992/0909/sys/src/9/port/proc.c 425,432c for(;;) { s = splhi(); if(canlock(r)) break; splx(s); } if(p->r==r && r->p==p && p->state==Wakeme){ /* check we won the race */ r->p = 0; p->r = 0; ready(p); . 361a /* * Expects that only one process can call wakeup for any given Rendez */ . ## diffname port/proc.c 1992/1206 ## diff -e /n/bootesdump/1992/0909/sys/src/9/port/proc.c /n/bootesdump/1992/1206/sys/src/9/port/proc.c 590,593c if(*s) putseg(*s); . 560c } else . 537c p = c->parent; if(p == 0) { . 519c Segment **s, **es; . 509c qunlock(&broken); . 507a broken.p[i] = 0; } . 506c for(i=0; istate = Broken; p->psstate = 0; sched(); . 476,479c qlock(&broken); if(broken.n == NBROKEN) { . 474c addbroken(Proc *p) . 467,468c struct { QLock; . 459c unlock(p->pgrp); . 457c ready(p); . 455c l = &d->rendhash; . 444,453c p->rendval = ~0; l = &REND(p->pgrp, p->rendtag); for(d = *l; d; d = d->rendhash) { if(d == p) { *l = p->rendhash; break; . 442a if(p->state != Rendezvous) return ret; /* Try and pull out of a rendezvous */ lock(p->pgrp); . ## diffname port/proc.c 1992/1208 ## diff -e /n/bootesdump/1992/1206/sys/src/9/port/proc.c /n/bootesdump/1992/1208/sys/src/9/port/proc.c 498,505c for(b=0; b < broken.n; b++) if(broken.p[b] != p) { broken.n--; memmove(&broken.p[b], &broken.p[b+1], sizeof(Proc*)*(NBROKEN-(b+1))); ready(p); break; } . ## diffname port/proc.c 1992/1225 ## diff -e /n/bootesdump/1992/1208/sys/src/9/port/proc.c /n/bootesdump/1992/1225/sys/src/9/port/proc.c 499c if(broken.p[b] == p) { . ## diffname port/proc.c 1993/0112 ## diff -e /n/bootesdump/1992/1225/sys/src/9/port/proc.c /n/bootesdump/1993/0112/sys/src/9/port/proc.c 396a if(p->kp) print("sending %s to kproc %d %s\n", n, p->pid, p->text); . ## diffname port/proc.c 1993/0216 ## diff -e /n/bootesdump/1993/0112/sys/src/9/port/proc.c /n/bootesdump/1993/0216/sys/src/9/port/proc.c 461d 456a ready(p); . ## diffname port/proc.c 1993/0309 ## diff -e /n/bootesdump/1993/0216/sys/src/9/port/proc.c /n/bootesdump/1993/0309/sys/src/9/port/proc.c 668a qunlock(&p->qwaitr); poperror(); . 654a if(!canqlock(&p->qwaitr)) error(Einuse); if(waserror()) { qunlock(&p->qwaitr); nexterror(); } . 593c . ## diffname port/proc.c 1993/0501 ## diff -e /n/bootesdump/1993/0309/sys/src/9/port/proc.c /n/fornaxdump/1993/0501/sys/src/brazil/port/proc.c 844c gotolabel(&up->errlab[--up->nerrlab]); . 837c strncpy(up->error, err, ERRLEN); . 809c if(p->nnote == 0) . 805c spllo(); /* pexit has locks in it */ . 775d 771,773c strcpy(p->user, eve); if(kpgrp == 0) . 759,769c kprocchild(p, func, arg); . 753,757c memmove(p->note, up->note, sizeof(p->note)); p->nnote = up->nnote; p->notified = 0; p->lastnote = up->lastnote; p->notify = up->notify; p->ureg = 0; p->dbgreg = 0; . 744,751c p->fpsave = up->fpsave; p->scallnr = up->scallnr; p->s = up->s; p->nerrlab = 0; p->slash = up->slash; p->dot = up->dot; incref(p->dot); . 739,742d 732,734d 729,730d 724,727d 709,716c s = p->psstate; if(s == 0) s = "kproc"; print("%3d:%10s pc %8lux %8s (%s) ut %ld st %ld bss %lux\n", p->pid, p->text, p->pc, s, statename[p->state], p->time[0], p->time[1], bss); . 702,707c for(i=0; istate == Dead) continue; bss = 0; if(p->seg[BSEG]) bss = p->seg[BSEG]->top; . 678c qunlock(&up->qwaitr); . 672,676c lock(&up->exl); wq = up->waitq; up->waitq = wq->next; up->nwait--; unlock(&up->exl); . 670c sleep(&up->waitr, haswaitq, up); . 668c unlock(&up->exl); . 663,665c lock(&up->exl); if(up->nchild == 0 && up->waitq == 0) { unlock(&up->exl); . 659c qunlock(&up->qwaitr); . 653,655c if(!canqlock(&up->qwaitr)) . 649d 632c up->state = Moribund; . 624,626c if(up->pdbg) { wakeup(&up->pdbg->sleep); up->pdbg = 0; . 622c qlock(&up->debug); . 614c for(f = up->waitq; f; f = next) { . 610,612c lock(&up->exl); /* Prevent my children from leaving waits */ up->pid = 0; unlock(&up->exl); . 605,606c es = &up->seg[NSEG]; for(s = up->seg; s < es; s++) . 603c addbroken(up); . 593c . 584c if(p->pid == up->parentpid && p->state != Broken && p->nwait < 128) { . 581,582c /* My parent still alive, processes are limited to 128 * Zombies to prevent a badly written daemon lots of wait * records . 574c n = sprint(wq->w.msg, "%s %d:", up->text, up->pid); . 572c TK2MS(MACHP(0)->ticks - up->time[TReal]), NUMSIZE); . 564,566c readnum(0, wq->w.pid, NUMSIZE, up->pid, NUMSIZE); utime = up->time[TUser] + up->time[TCUser]; stime = up->time[TSys] + up->time[TCSys]; . 560c ; . 551,552c if(up->kp == 0) { p = up->parent; . 546a close(up->dot); closepgrp(up->pgrp); . 540,545c if(up->fgrp) closefgrp(up->fgrp); if(up->egrp) closeegrp(up->egrp); . 537,538c up->alarm = 0; . 534a long utime, stime; . 532,533c Proc *p; . 461a ready(p); . 457d 437c /* check we won the race */ if(p->r == r && r->p == p && p->state==Wakeme) { . 429,430c if(r = p->r) { . 424,425d 418,420c if(p->nnote < NNOTE) { strcpy(p->note[up->nnote].msg, n); p->note[p->nnote++].flag = flag; . 406,416d 400,404c if(flag != NUser && (p->notify == 0 || p->notified)) p->nnote = 0; . 388,389d 359c up->twhen = 0; . 351,355c up->trend = r; up->twhen = when; up->tfn = fn; up->tlink = *l; *l = up; . 337,338c if(f == up) { *l = up->tlink; . 334c if(up->trend) { . 329d 327c Proc *f, **l; . 317,320c return MACHP(0)->ticks >= up->twhen || (*up->tfn)(arg); . 306c if(r->p == up) . 302,303c if(up->notepending) { up->notepending = 0; . 300c if(up->notepending == 0) . 298d 295d 287,288c up->state = Wakeme; r->p = up; . 284c print("double sleep %d %d\n", r->p->pid, up->pid); . 273c up->r = 0; . 265,266c up->r = r; /* early so postnote knows */ . 257d 236c procalloc.free = p->qnext; unlock(&procalloc); procalloc.free = p->qnext; p->state = Scheding; p->psstate = "New"; p->mach = 0; p->qnext = 0; p->nchild = 0; p->nwait = 0; p->waitq = 0; p->pgrp = 0; p->egrp = 0; p->fgrp = 0; p->pdbg = 0; p->fpstate = FPinit; p->kp = 0; p->procctl = 0; p->notepending = 0; memset(p->seg, 0, sizeof p->seg); p->pid = incref(&pidalloc); p->noteid = incref(¬eidalloc); if(p->pid==0 || p->noteid==0) panic("pidalloc"); if(p->kstack == 0) p->kstack = smalloc(KSTACK); return p; . 234a lock(&procalloc); . 207,232c if(p = procalloc.free) break; . 205a lock(&procalloc); . 168c /* p->mach==0 only when process state is saved */ if(p == 0 || p->mach){ . 157c while(runhiq.head == 0 && runloq.head == 0) . 129,130d 126a rq = &runhiq; . 123a Schedq *rq; . 122d 108,110c up = runproc(); up->state = Running; up->mach = m; m->proc = up; mmuswitch(up); gotolabel(&up->sched); . 96,102c procsave(up); if(setlabel(&up->sched)) { procrestore(up); . 91,93c if(up) { . 83c up->mach = 0; up = 0; . 81a break; . 80c qunlock(&up->debug); . 76,77c up->qnext = procalloc.free; procalloc.free = up; . 72,74c mmurelease(up); . 59,67c switch(up->state) { case Running: ready(up); break; case Moribund: up->pid = 0; up->state = Dead; . 57c if(up) { . 54,55d ## diffname port/proc.c 1993/0528 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0528/sys/src/brazil/port/proc.c 162a if(conf.nmach > 1) delay(7); /* keep off the bus (tuned for everest) */ . ## diffname port/proc.c 1993/0729 ## diff -e /n/fornaxdump/1993/0528/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0729/sys/src/brazil/port/proc.c 86a kmapinval(); . ## diffname port/proc.c 1993/0731 ## diff -e /n/fornaxdump/1993/0729/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0731/sys/src/brazil/port/proc.c 87d ## diffname port/proc.c 1993/0801 ## diff -e /n/fornaxdump/1993/0731/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0801/sys/src/brazil/port/proc.c 138,140d 86a kmapinval(); . ## diffname port/proc.c 1993/0804 ## diff -e /n/fornaxdump/1993/0801/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0804/sys/src/brazil/port/proc.c 87d ## diffname port/proc.c 1993/0829 ## diff -e /n/fornaxdump/1993/0804/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0829/sys/src/brazil/port/proc.c 161c delay(7); . 159a /* keep off the bus (tuned for everest) */ . ## diffname port/proc.c 1993/0830 ## diff -e /n/fornaxdump/1993/0829/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0830/sys/src/brazil/port/proc.c 160,162d ## diffname port/proc.c 1993/0904 ## diff -e /n/fornaxdump/1993/0830/sys/src/brazil/port/proc.c /n/fornaxdump/1993/0904/sys/src/brazil/port/proc.c 147a . ## diffname port/proc.c 1993/1123 ## diff -e /n/fornaxdump/1993/0904/sys/src/brazil/port/proc.c /n/fornaxdump/1993/1123/sys/src/brazil/port/proc.c 800a void killbig(void) { int i; Segment *s; ulong l, max; Proc *p, *ep, *kp; max = 0; kp = 0; ep = procalloc.arena+conf.nproc; for(p = procalloc.arena; p < ep; p++) { if(p->state == Dead || p->kp) continue; l = 0; for(i=1; iseg[i]; if(s) l += s->top - s->base; } if(l > max) { kp = p; max = l; } } print("%d: %s killed because no swap configured", kp->pid, kp->text); kp->procctl = Proc_exitme; postnote(kp, 1, "killed: proc too big", NExit); } . ## diffname port/proc.c 1993/1201 ## diff -e /n/fornaxdump/1993/1123/sys/src/brazil/port/proc.c /n/fornaxdump/1993/1201/sys/src/brazil/port/proc.c 231a memset(p->counter, 0, sizeof(p->counter)); memset(p->syscall, 0, sizeof(p->syscall)); . 89a up->counter[CSCNTR]++; up->counter[TLBCNTR] += m->tlbfault - m->otlbfault; m->otlbfault = m->tlbfault; . ## diffname port/proc.c 1993/1204 ## diff -e /n/fornaxdump/1993/1201/sys/src/brazil/port/proc.c /n/fornaxdump/1993/1204/sys/src/brazil/port/proc.c 227a p->mp = 0; . 154a if(m->runq.head) rq = &m->runq; else . 149c while(runhiq.head == 0 && runloq.head == 0 && m->runq.head == 0) . 123a if(p->mp) rq = &p->mp->runq; else . 112c return runloq.head != 0 || runhiq.head != 0 || m->runq.head != 0; . 24,30d ## diffname port/proc.c 1993/1212 ## diff -e /n/fornaxdump/1993/1204/sys/src/brazil/port/proc.c /n/fornaxdump/1993/1212/sys/src/brazil/port/proc.c 172a . 159a lock(&runhiq); . 150,154d 147d 145c while(runhiq.head == 0 && runloq.head == 0) . 121a else rq = &runhiq; . 116,119d 105c return runhiq.head != 0 || runloq.head != 0; . 84,85c up->counter[TLBCNTR] += m->tlbfault - m->otlbfault; m->otlbfault = m->tlbfault; . 81a /* statistics */ . ## diffname port/proc.c 1993/1214 ## diff -e /n/fornaxdump/1993/1212/sys/src/brazil/port/proc.c /n/fornaxdump/1993/1214/sys/src/brazil/port/proc.c 153c rq = &m->loq; . 150,151c if(m->hiq.head) rq = &m->hiq; . 146c while(m->hiq.head == 0 && m->loq.head == 0) . 122c rq = &affinity(p)->hiq; . 120c rq = &m->loq; . 108c return m->hiq.head != 0 || m->loq.head != 0; . 86,87d ## diffname port/proc.c 1993/1215 ## diff -e /n/fornaxdump/1993/1214/sys/src/brazil/port/proc.c /n/fornaxdump/1993/1215/sys/src/brazil/port/proc.c 162a rq->n--; . 129c rq->n++; . 25a Schedq runhiq; . 24d ## diffname port/proc.c 1994/0311 ## diff -e /n/fornaxdump/1993/1215/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0311/sys/src/brazil/port/proc.c 100a } void newcallback(void (*func)(void)) { *m->cbin = func; if(++m->cbin >= m->cbend) m->cbin = m->calls; } void callbacks(void) { void (*func)(void); while(m->cbin != m->cbout) { func = *m->cbout; if(++m->cbout >= m->cbend) m->cbout = m->calls; func(); } . 89a callbacks(); . 46a m->cbin = m->calls; m->cbout = m->calls; m->cbend = &m->calls[NCALLBACK]; . ## diffname port/proc.c 1994/0320 ## diff -e /n/fornaxdump/1994/0311/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0320/sys/src/brazil/port/proc.c 127,132d 115a int anyready(void) { return m->hiq.head != 0 || m->loq.head != 0; } . ## diffname port/proc.c 1994/0321 ## diff -e /n/fornaxdump/1994/0320/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0321/sys/src/brazil/port/proc.c 114,119d 107a int anyready(void) { return m->hiq.head != 0 || m->loq.head != 0; } . ## diffname port/proc.c 1994/0322 ## diff -e /n/fornaxdump/1994/0321/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0322/sys/src/brazil/port/proc.c 47,50d ## diffname port/proc.c 1994/0324 ## diff -e /n/fornaxdump/1994/0322/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0324/sys/src/brazil/port/proc.c 115a if(m->hiq.head == 0 && m->loq.head == 0) return 1; return 0; . 110c int . ## diffname port/proc.c 1994/0325 ## diff -e /n/fornaxdump/1994/0324/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0325/sys/src/brazil/port/proc.c 856c print("%d: %s killed because no swap configured\n", kp->pid, kp->text); . 846c for(i=1; iqpc, p->time[0], p->time[1], bss); . 713c print("%3d:%10s pc %8lux %8s (%s) q %lux ut %ld st %ld bss %lux\n", . 132c c->func(c->arg); . 129c c = m->cbout; . 126c Callbk *c; . 117,120c c->func = func; c->arg = a; . 113c Callbk *c; c = m->cbin; . 110,111c void newcallback(void (*func)(void*), void *a) . ## diffname port/proc.c 1994/0406 ## diff -e /n/fornaxdump/1994/0325/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0406/sys/src/brazil/port/proc.c 716c p->time[0], p->time[1], bss); . 714c print("%3d:%10s pc %8lux %8s (%s) ut %ld st %ld bss %lux\n", . ## diffname port/proc.c 1994/0407 ## diff -e /n/fornaxdump/1994/0406/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0407/sys/src/brazil/port/proc.c 277a p->syscall = xalloc(nsyscall * sizeof(ulong)); } . 276c for(i=0; iloq; . ## diffname port/proc.c 1994/0727 ## diff -e /n/fornaxdump/1994/0725/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0727/sys/src/brazil/port/proc.c 152d 147c lock(&runhiq); if(runhiq.head) rq = &runhiq; else if(m->hiq.head) . 143c while(runhiq.head == 0 && m->hiq.head == 0 && m->loq.head == 0) . 116c if(p->priority) rq = &runhiq; else if(p->state == Running) . 25c Schedq runhiq; /* for hi priority process, don't bother with affinity */ . ## diffname port/proc.c 1994/0728 ## diff -e /n/fornaxdump/1994/0727/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0728/sys/src/brazil/port/proc.c 689a } for(rq = runq; rq < &runq[Nrq]; rq++){ print("rq%d:", rq-runq); for(p = rq->head; p; p = p->rnext) print(" %d", p->pid); print("\n"); . 674a Schedq *rq; . 188c unlock(&runq[0]); . 182c lock(&runq[0]); . 172a p->mp = m; . 170c unlock(runq); . 164,165c rq->tail = l; if(l) l->rnext = p->rnext; else rq->head = p->rnext; . 160c unlock(&runq[0]); . 157,158c /* * affinity: look for a process last run on this processor, * otherwise, take first in list. */ l = 0; for(p = rq->head; p; p = p->rnext){ if(p->mp == m) break; l = p; } if(p == 0){ l = 0; p = rq->head; } /* * p->mach==0 only when process state is saved */ . 149,155c lock(runq); . 145,146c for(rq = runq; rq < &runq[Nrq]; rq++) if(rq->head) break; if(rq == &runq[Nrq]) goto loop; . 143a /* * find highest priority queue with runnable process */ . 141c Proc *p, *l; . 133c unlock(runq); . 123c lock(runq); . 116,121c if(p->priority != 0){ if(p->state == Running){ if(p->priority < Nrq-1) p->priority++; } else p->priority = 1; } if(p->priority < 0 || p->priority >= Nrq) panic("ready"); rq = &runq[p->priority]; . 105c Schedq *rq; for(rq = runq; rq < &runq[Nrq]; rq++) if(rq->head) return 1; return 0; . 25c Schedq runq[Nrq]; . 23a enum { Nrq = 5, /* number of run queues */ }; . ## diffname port/proc.c 1994/0729 ## diff -e /n/fornaxdump/1994/0728/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0729/sys/src/brazil/port/proc.c 263a p->movetime = 0; . 207a if(p->mp != m) p->movetime = m->ticks; . 183,186d 179c if(rq == runq || p->mp == m || m->ticks - p->movetime > HZ/2) . 173,176d 170a found: splhi(); . 164,169c for(;;){ for(rq = runq; rq < &runq[Nrq]; rq++){ if(rq->head == 0) continue; for(p = rq->head; p; p = p->rnext){ if(rq == runq || p->mp == m || m->ticks - p->movetime > HZ/2) goto found; } } } . 161c * find a process at level 0 (programs from '/' file system), * one that last ran on this processor (affinity), * or one that hasn't moved in a while (load balancing). . 135d 111,117c return nrdy; . ## diffname port/proc.c 1994/0805 ## diff -e /n/fornaxdump/1994/0729/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0805/sys/src/brazil/port/proc.c 368a if(i++ > 20) { print("tlarm loop: %lux\n", talarm.list); for(i = 20, f = talarm.list; f && i--; f = f->tlink) print("%lux ", f); for(;;); } . 361a i = 0; . 354c ulong when, i; . ## diffname port/proc.c 1994/0808 ## diff -e /n/fornaxdump/1994/0805/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0808/sys/src/brazil/port/proc.c 122,128c if(p->state == Running){ if(p->priority < Nrq-1) p->priority++; } else p->priority = p->basepri; . ## diffname port/proc.c 1994/0809 ## diff -e /n/fornaxdump/1994/0808/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0809/sys/src/brazil/port/proc.c 736a print("nrdy %d\n", nrdy); . 113a int anyready0(void) { return runq->head != 0; } . ## diffname port/proc.c 1994/0810 ## diff -e /n/fornaxdump/1994/0809/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0810/sys/src/brazil/port/proc.c 740c print(" %d(%d)", p->pid, m->ticks - p->readyticks); . 143a p->readyticks = m->ticks; . ## diffname port/proc.c 1994/0812 ## diff -e /n/fornaxdump/1994/0810/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0812/sys/src/brazil/port/proc.c 563a if(up->rgrp) closergrp(up->rgrp); . 484c unlock(p->rgrp); . 474c l = &REND(p->rgrp, p->rendtag); . 471c lock(p->rgrp); . 375,380d 367d 359c ulong when; . 259a p->rgrp = 0; . ## diffname port/proc.c 1994/0816 ## diff -e /n/fornaxdump/1994/0812/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0816/sys/src/brazil/port/proc.c 25,29d ## diffname port/proc.c 1994/0817 ## diff -e /n/fornaxdump/1994/0816/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0817/sys/src/brazil/port/proc.c 140a if(lastreadied > p->priority) lastreadied = p->priority; . 112c int x; x = lastreadied; lastreadied = Nrq; return nrdy && x <= up->priority; . 110c anyhigher(void) . 25a int lastreadied; . ## diffname port/proc.c 1994/0830 ## diff -e /n/fornaxdump/1994/0817/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0830/sys/src/brazil/port/proc.c 736a if(rq->head == 0) continue; . ## diffname port/proc.c 1994/0914 ## diff -e /n/fornaxdump/1994/0830/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0914/sys/src/brazil/port/proc.c 23a typedef struct { Lock; Proc *head; Proc *tail; int n; } Schedq; . ## diffname port/proc.c 1994/0915 ## diff -e /n/fornaxdump/1994/0914/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0915/sys/src/brazil/port/proc.c 743c for(rq = &runq[Nrq-1]; rq >= runq; rq--){ . 235c unlock(runq); . 229c lock(runq); . 201c unlock(runq); . 192c if(p->mp == m || m->ticks - p->movetime > HZ/2) . 178,179c if(p->mp == m || m->ticks - p->movetime > HZ/2) . 174c for(rq = &runq[Nrq-1]; rq >= runq; rq--){ . 168,169c * find a process that last ran on this processor (affinity), . 153c if(p->priority > lastreadied) . 136,137c if(p->priority > 0) p->priority--; . 123,124c lastreadied = 0; return nrdy && x >= up->priority; . ## diffname port/proc.c 1994/0917 ## diff -e /n/fornaxdump/1994/0915/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0917/sys/src/brazil/port/proc.c 332a up->art = (up->art + up->rt)>>1; up->rt = 0; . 135,139c if(p->state == Running) p->rt++; pri = p->basepri - (((p->art + p->rt)>>1)/Squantum); if(pri < 0) pri = 0; . 130c int s, pri; . 126a enum { Squantum = (HZ+Nrq-1)/Nrq, }; . ## diffname port/proc.c 1994/0918 ## diff -e /n/fornaxdump/1994/0917/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0918/sys/src/brazil/port/proc.c 753c print(" %d(%d)", p->pid, m->ticks - p->readytime); . 177a /* * Once a second we look for a long waiting process * in the lowest priority queue to make sure nothing * gets starved out by a malfunctioning high priority * process. */ if(m->machno == 0 && m->ticks - lastfair > HZ){ lastfair = m->ticks; for(rq = runq; rq < &runq[Nrq]; rq++){ p = rq->head; if(p){ i = m->ticks - p->readytime; if(i > HZ){ p->art = 0; p->movetime = 0; goto found; } break; } } } /* * get highest priority process that this * processor can run given affinity constraints */ . 168a static ulong lastfair; . 166a int i; . 156c p->readytime = m->ticks; . 144a p->priority = pri; . ## diffname port/proc.c 1994/0920 ## diff -e /n/fornaxdump/1994/0918/sys/src/brazil/port/proc.c /n/fornaxdump/1994/0920/sys/src/brazil/port/proc.c 813a p->basepri = PriKproc; p->priority = p->basepri; . 367,368d 144a /* the only intersection between the classes is at PriNormal */ if(pri < PriNormal && p->basepri > PriNormal) pri = PriNormal; . 142c pri = ((p->art + (p->rt<<1))>>2)/Squantum; } else { p->art = (p->art + (p->rt<<1))>>2; p->rt = 0; pri = p->art/Squantum; } pri = p->basepri - pri; . 140c /* history counts */ if(p->state == Running){ . ## diffname port/proc.c 1994/1027 ## diff -e /n/fornaxdump/1994/0920/sys/src/brazil/port/proc.c /n/fornaxdump/1994/1027/sys/src/brazil/port/proc.c 940a /* * change ownership to 'new' of all processes owned by 'old'. Used when * eve changes. */ void renameuser(char *old, char *new) { Proc *p, *ep; ep = procalloc.arena+conf.nproc; for(p = procalloc.arena; p < ep; p++) if(strcmp(old, p->user) == 0) memmove(p->user, new, NAMELEN); } . ## diffname port/proc.c 1995/0101 ## diff -e /n/fornaxdump/1994/1027/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0101/sys/src/brazil/port/proc.c 221c for(; p; p = p->rnext){ . 219c p = rq->head; if(p == 0) . ## diffname port/proc.c 1995/0102 ## diff -e /n/fornaxdump/1995/0101/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0102/sys/src/brazil/port/proc.c 825,826c p->nice = NiceKproc; p->pri = 0; . 787,792c if(runq.head != 0) { print("rq:"); for(p = runq.head; p; p = p->rnext) print(" %d(%d)", p->pid, p->pri); . 770d 332a procwired(Proc *p) { Proc *pp; int i, bm; char nwired[MAXMACH]; memset(nwired, 0, sizeof(nwired)); p->wired = 0; pp = proctab(0); for(i=0; iwired && pp->pid) nwired[pp->wired->machno]++; bm = 0; for(i=0; iwired = MACHP(bm); print("pid %d wired to machine %d\n", p->pid, p->wired->machno); } void . 331a /* * wire this proc to a machine */ . 319,320c p->nice = NiceNormal; p->pri = 0; p->wired = 0; . 279c unlock(&runq); . 273c lock(&runq); . 260,264c if(bp->state != Ready) print("runproc %s %d %s\n", bp->text, bp->pid, statename[bp->state]); unlock(&runq); bp->state = Scheding; return bp; . 256,258d 253,254c op->rnext = bp->rnext; if(bp == runq.tail) runq.tail = op; /* clear next so that unlocked runq will not loop */ bp->rnext = 0; runq.n--; . 248,251c found: /* unlink found proc from runq */ op = 0; for(p=runq.head; p; p=p->rnext) { if(p == bp) break; op = p; } if(op == 0) runq.head = bp->rnext; . 240,245c if(bp == 0) { unlock(&runq); . 234,238c /* find best proc while locked */ bp = 0; for(p=runq.head; p; p=p->rnext) { if(p->mach) continue; if(p->wired && p->wired != m) continue; if(bp == 0 || p->pri < bp->pri) bp = p; . 232c lock(&runq); . 229,230d 227a if(p == 0) goto loop; . 218,226c if(p->wired && p->wired != m) continue; break; . 215,216c * wired to another machine . 198,213c if(p->mach) continue; . 193,196c * state is not saved . 191c /* look for potential proc while not locked */ for(p=runq.head; p; p=p->rnext) { . 185,189d 179,182c Proc *p, *bp, *op; . 170,172c unlock(&runq); . 168d 164,166c runq.head = p; runq.tail = p; runq.n++; . 161,162c if(runq.tail) runq.tail->rnext = p; . 140,159c lock(&runq); . 135,136c int s; . 127,131d 122,124c return nrdy; . 120d 33,34c Schedq runq; . ## diffname port/proc.c 1995/0104 ## diff -e /n/fornaxdump/1995/0102/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0104/sys/src/brazil/port/proc.c 926a } /* * time accounting called by clock() splhi'd */ void accounttime(void) { Proc *p; int i, pri; static int nrun, m0ticks; p = m->proc; if(p) { nrun++; p->time[p->insyscall]++; p->pri += priconst[p->nice]; } /* only one processor gets to compute system load averages */ if(m->machno != 0) return; /* calculate decaying load average */ pri = nrun; nrun = 0; pri = (nrdy+pri)*1000; m->load = (m->load*19+pri)/20; /* * decay per-process cpu usage * pri = (7/8)*pri twice per second * tc = (7/8)^2/(1-(7/8)^2) = 3.27 sec */ m0ticks--; if(m0ticks <= 0) { m0ticks = HZ/2; p = proctab(0); for(i=conf.nproc-1; i!=0; i--,p++) if(p->state != Dead) { pri = p->pri; pri -= pri >> 3; p->pri = pri; } } . 910a for(i = 0; i < NSEG; i++) { s = kp->seg[i]; if(s != 0 && canqlock(&s->lk)) { mfreeseg(s, s->base, (s->top - s->base)/BY2PG); qunlock(&s->lk); } } print("%d: %s killed because no swap configured\n", kp->pid, kp->text); . 909d 901c if(s != 0) . 676d 674a /* Sched must not loop for this lock */ . 673a qunlock(&up->debug); . 669a qlock(&up->debug); . 665,668d 654a *s = 0; } } . 652,653c for(s = up->seg; s < es; s++) { if(*s) { . 471c r = p->r; if(r != 0) { . 318a /* * set up priority increments * normal priority sb about 1000/HZ * highest pri (lowest number) sb about 0 */ for(i=0; ipri; for(p=runq.head; p; p=p->rnext) if(p->pri < pri) if(p->wired == 0 || p->wired == m) return runq.n; return 0; . 115a Proc *p; int pri; . 110c return runq.n; . 32d ## diffname port/proc.c 1995/0106 ## diff -e /n/fornaxdump/1995/0105/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0106/sys/src/brazil/port/proc.c 372a } . 371c if(up->notepending == 0) { up->yield = 1; . 182a } else if(p->yield == 0 && p->pri < bp->pri) bp = p; . 179,181c if(bp == 0) { p->yield = 0; . 176,177c for(p = runq.head; p; p=p->rnext) { if(p->mach || (p->wired && p->wired != m)) . 159,166c if(!(p->mach || (p->wired && p->wired != m))) break; . 157c * state is not saved or wired to another machine . 155c for(p = runq.head; p; p=p->rnext) { . 122c return 1; . ## diffname port/proc.c 1995/0107 ## diff -e /n/fornaxdump/1995/0106/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0107/sys/src/brazil/port/proc.c 120c if(p->pri <= pri) . 117a return runq.n; . ## diffname port/proc.c 1995/0108 ## diff -e /n/fornaxdump/1995/0107/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0108/sys/src/brazil/port/proc.c 175c if(p->yield) p->yield = 0; . ## diffname port/proc.c 1995/0109 ## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0109/sys/src/brazil/port/proc.c 987c pri -= pri >> 2; . 977,978c * pri = (3/4)*pri twice per second * tc = (3/4)^2/(1-(3/4)^2) = 1.286 sec . 963a if(up) { i = up->inlock-1; if(i < 0) i = 0; up->inlock = i; } . 118d ## diffname port/proc.c 1995/0110 ## diff -e /n/fornaxdump/1995/0109/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0110/sys/src/brazil/port/proc.c 978,996c n = (nrdy+n)*1000; m->load = (m->load*19+n)/20; . 975c n = nrun; . 963,969d 960d 953,954c int n; static int nrun; . 874a if((getstatus()&IE) == 0) print("error hi %lux\n", getcallerpc(err)); spllo(); . 805,806c p->basepri = PriKproc; p->priority = p->basepri; . 775c print("nrdy %d\n", nrdy); . 769,772c for(rq = &runq[Nrq-1]; rq >= runq; rq--){ if(rq->head == 0) continue; print("rq%d:", rq-runq); for(p = rq->head; p; p = p->rnext) print(" %d(%d)", p->pid, m->ticks - p->readytime); . 752a Schedq *rq; . 396a if((getstatus()&IE) == 0) print("tsleep hi %lux\n", getcallerpc(r)); . 371d 368,369c if(up->notepending == 0) . 366a if((getstatus()&IE) == 0) print("sleep hi %lux\n", getcallerpc(r)); . 316,323d 300a p->movetime = 0xffffffff; p->mp = p->wired; . 266,267c p->mp = 0; p->movetime = 0; . 226c unlock(runq); . 220c lock(runq); . 201,211c p->state = Scheding; if(p->mp != m) p->movetime = m->ticks + HZ/2; p->mp = m; return p; . 197,199c rq->head = p->rnext; rq->n--; nrdy--; if(p->state != Ready) print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]); unlock(runq); . 185,195c if(p->rnext == 0) rq->tail = l; if(l) l->rnext = p->rnext; . 181,182c /* * p->mach==0 only when process state is saved */ if(p == 0 || p->mach){ unlock(runq); . 168,179c l = 0; for(p = rq->head; p; p = p->rnext){ if(p->mp == m || p->movetime < m->ticks) break; l = p; . 166c lock(runq); . 164a found: . 162,163d 159,160c for(rq = &runq[Nrq-1]; rq >= runq; rq--){ p = rq->head; if(p == 0) continue; for(; p; p = p->rnext){ if(p->mp == m || p->movetime < m->ticks) goto found; } } . 157c * get highest priority process that this * processor can run given affinity constraints . 154,155c i = m->ticks - p->readytime; if(i < HZ) break; p->art = 0; goto found; } } . 152a for(;;){ /* * Once a second we look for a long waiting process * in the lowest priority queue to make sure nothing * gets starved out by a malfunctioning high priority * process. */ if((m->ticks % HZ) == 0){ for(rq = runq; rq < &runq[Nrq]; rq++){ p = rq->head; if(p == 0 || p->mp != m) continue; . 151a /* * find a process that last ran on this processor (affinity), * or one that hasn't moved in a while (load balancing). */ . 149c int i; Schedq *rq; Proc *p, *l; . 142c if(p->priority > lastreadied) lastreadied = p->priority; unlock(runq); . 138,140c rq->head = p; rq->tail = p; rq->n++; nrdy++; p->readytime = m->ticks; . 135,136c if(rq->tail) rq->tail->rnext = p; . 133c /* history counts */ if(p->state == Running){ p->rt++; pri = ((p->art + (p->rt<<1))>>2)/Squantum; } else { p->art = (p->art + (p->rt<<1))>>2; p->rt = 0; pri = p->art/Squantum; } pri = p->basepri - pri; if(pri < 0) pri = 0; /* the only intersection between the classes is at PriNormal */ if(pri < PriNormal && p->basepri > PriNormal) pri = PriNormal; p->priority = pri; rq = &runq[p->priority]; lock(runq); . 129c int s, pri; Schedq *rq; . 125a enum { Squantum = (HZ+Nrq-1)/Nrq, }; . 118,123c x = lastreadied; lastreadied = 0; return nrdy && x >= up->priority; . 115,116c int x; . 109c return nrdy; . 32,33c int nrdy; int lastreadied; Schedq runq[Nrq]; . ## diffname port/proc.c 1995/0112 ## diff -e /n/fornaxdump/1995/0110/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0112/sys/src/brazil/port/proc.c 913a splx(s); . 912c sched(); . 903c s = spllo(); . 886a ulong s; . 67c * procalloc . ## diffname port/proc.c 1995/0115 ## diff -e /n/fornaxdump/1995/0112/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0115/sys/src/brazil/port/proc.c 315a p->ureg = 0; . ## diffname port/proc.c 1995/0126 ## diff -e /n/fornaxdump/1995/0115/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0126/sys/src/brazil/port/proc.c 926,927d 440,442d 409,411d ## diffname port/proc.c 1995/0215 ## diff -e /n/fornaxdump/1995/0126/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0215/sys/src/brazil/port/proc.c 974d 965c kp->procctl = Proc_exitbig; . 884a case Proc_exitbig: spllo(); pexit("Killed: Insufficient physical memory", 1); . ## diffname port/proc.c 1995/0329 ## diff -e /n/fornaxdump/1995/0215/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0329/sys/src/brazil/port/proc.c 668a wq->w.msg[ERRLEN-1] = 0; . ## diffname port/proc.c 1995/0811 ## diff -e /n/fornaxdump/1995/0329/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0811/sys/src/brazil/port/proc.c 257c p->mp = MACHP(m->machno); . 255c if(p->mp != MACHP(m->machno)) . 230c if(p->mp == MACHP(m->machno) || p->movetime < m->ticks) . 217c if(p->mp == MACHP(m->machno) || p->movetime < m->ticks) . 196c if(p == 0 || p->mp != MACHP(m->machno)) . 101c up->mach = MACHP(m->machno); . ## diffname port/proc.c 1995/0910 ## diff -e /n/fornaxdump/1995/0811/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0910/sys/src/brazil/port/proc.c 186c for(randomcount++;;randomcount++){ . 49a ulong randomcount; . ## diffname port/proc.c 1995/0912 ## diff -e /n/fornaxdump/1995/0910/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0912/sys/src/brazil/port/proc.c 188c for(;;){ if(m->machno == 0) randomcount++; . ## diffname port/proc.c 1995/0913 ## diff -e /n/fornaxdump/1995/0912/sys/src/brazil/port/proc.c /n/fornaxdump/1995/0913/sys/src/brazil/port/proc.c 189,191d 50,51d ## diffname port/proc.c 1995/1009 ## diff -e /n/fornaxdump/1995/0913/sys/src/brazil/port/proc.c /n/fornaxdump/1995/1009/sys/src/brazil/port/proc.c 816c print(" %d(%d, %d)", p->pid, m->ticks - p->readytime, m->ticks - p->movetime); . 795a if(up) print("up %d\n", up->pid); else print("no current process\n"); . ## diffname port/proc.c 1995/1024 ## diff -e /n/fornaxdump/1995/1009/sys/src/brazil/port/proc.c /n/fornaxdump/1995/1024/sys/src/brazil/port/proc.c 811,812c print("%3d:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux\n", p->pid, p->text, p->pc, dbgpc(p), s, statename[p->state], . ## diffname port/proc.c 1995/1030 ## diff -e /n/fornaxdump/1995/1024/sys/src/brazil/port/proc.c /n/fornaxdump/1995/1030/sys/src/brazil/port/proc.c 822a delay(150); . 814a } void scheddump(void) { Proc *p; Schedq *rq; . 808,813c dumpaproc(p); delay(150); . 804,806d 793,794d 791d 787a dumpaproc(Proc *p) { ulong bss; char *s; if(p == 0) return; bss = 0; if(p->seg[BSEG]) bss = p->seg[BSEG]->top; s = p->psstate; if(s == 0) s = "kproc"; print("%3d:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux\n", p->pid, p->text, p->pc, dbgpc(p), s, statename[p->state], p->time[0], p->time[1], bss, p->priority); } void . ## diffname port/proc.c 1995/1111 ## diff -e /n/fornaxdump/1995/1030/sys/src/brazil/port/proc.c /n/fornaxdump/1995/1111/sys/src/brazil/port/proc.c 296d ## diffname port/proc.c 1995/1230 ## diff -e /n/fornaxdump/1995/1111/sys/src/brazil/port/proc.c /n/fornaxdump/1995/1230/sys/src/brazil/port/proc.c 725a lock(&palloc); . 72a unlock(&palloc); . ## diffname port/proc.c 1996/0121 ## diff -e /n/fornaxdump/1995/1230/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0121/sys/src/brazil/port/proc.c 710a wakeup(&up->waitr); . ## diffname port/proc.c 1996/0315 ## diff -e /n/fornaxdump/1996/0121/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0315/sys/src/brazil/port/proc.c 224d 219c if(p->mp == MACHP(m->machno) || p->movetime < m->ticks) . 200,206c for(; p; p = p->rnext){ if(p->mp != MACHP(m->machno)) if(p->movetime >= m->ticks) continue; i = m->ticks - p->readytime; if(i >= 2*nrdy*p->art) goto found; } . 198c if(p == 0) . 195c if((m->ticks & 3) == 0){ . 190,193c * get lowest priority process that this * processor can run given affinity constraints * and that hasn't run in a while . ## diffname port/proc.c 1996/0426 ## diff -e /n/fornaxdump/1996/0315/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0426/sys/src/brazil/port/proc.c 317a p->error[0] = '\0'; . ## diffname port/proc.c 1996/0511 ## diff -e /n/fornaxdump/1996/0426/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0511/sys/src/brazil/port/proc.c 140,141c if(up->priority == PriLock){ pri = 0; } else { p->rt++; pri = ((p->art + (p->rt<<1))>>2)/Squantum; } . ## diffname port/proc.c 1996/0516 ## diff -e /n/fornaxdump/1996/0511/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0516/sys/src/brazil/port/proc.c 158a . 156c if(pri < PriNormal && base > PriNormal) . 151c pri = base - pri; . 140,145c p->rt++; pri = ((p->art + (p->rt<<1))>>2)/Squantum; . 137a /* * This interacts with code in taslock(). The intent is to keep the * priority of a process trying for a lock lower than the process holding * the lock. */ if(p->lockpri) base = p->lockpri; else base = p->basepri; . 133c int s, pri, base; . ## diffname port/proc.c 1996/0522 ## diff -e /n/fornaxdump/1996/0516/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0522/sys/src/brazil/port/proc.c 329a p->lockpri = 0; . ## diffname port/proc.c 1996/0523 ## diff -e /n/fornaxdump/1996/0522/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0523/sys/src/brazil/port/proc.c 165a /* hack for livelocks due to priority */ if(p->lockpri) pri = 0; p->priority = pri; . 164d 162c if(pri < PriNormal && p->basepri > PriNormal) . 157c pri = p->basepri - pri; . 138,147d 133c int s, pri; . ## diffname port/proc.c 1996/0626 ## diff -e /n/fornaxdump/1996/0523/sys/src/brazil/port/proc.c /n/fornaxdump/1996/0626/sys/src/brazil/port/proc.c 518c strcpy(p->note[p->nnote].msg, n); . ## diffname port/proc.c 1996/1016 ## diff -e /n/fornaxdump/1996/0626/sys/src/brazil/port/proc.c /n/fornaxdump/1996/1016/sys/src/brazil/port/proc.c 697a unlock(&p->exl); . 695d 683,685c /* * If my parent is no longer alive, or if there would be more * than 128 zombie child processes for my parent, then don't * leave a wait record behind. This helps prevent badly * written daemon processes from accumulating lots of wait * records. . 539a unlock(&p->rlock); . 533a /* the canlock deals with a different lock ordering * twixt r and p->rlock than everywhere else. If we * locked in the normal order we wouldn't be sure * r was valid when we did the lock. */ if(!canlock(r)){ unlock(&p->rlock); splx(s); continue; } . 532a break; . 526,531c for(;;){ s = splhi(); lock(&p->rlock); r = p->r; if(r == 0){ unlock(&p->rlock); . 493a unlock(&p->rlock); . 489a lock(&p->rlock); . 426a unlock(&up->rlock); . 424a lock(&up->rlock); . 408a up->r = r; unlock(&up->rlock); . 393a unlock(&up->rlock); . 387a lock(&up->rlock); . 386d ## diffname port/proc.c 1996/1017 ## diff -e /n/fornaxdump/1996/1016/sys/src/brazil/port/proc.c /n/fornaxdump/1996/1017/sys/src/brazil/port/proc.c 564a unlock(&p->rlock); splx(s); . 533,563c s = splhi(); lock(&p->rlock); r = p->r; if(r){ if(r->p != p || p->r != r || p->state != Wakeme) panic("postnote: state"); r->p = 0; p->r = 0; ready(p); . 503c unlock(&p->rlock); . 500d 494,495c if(p == 0) return; s = splhi(); lock(&p->rlock); if(r->p == p && p->r == r){ . 491,492d 432d 427d 412d 409d 404,407d 395d 393c r->p = 0; . 387a if(r->p){ print("double sleep %d %d\n", r->p->pid, up->pid); dumpstack(); } r->p = up; . 386d ## diffname port/proc.c 1997/0220 ## diff -e /n/fornaxdump/1996/1017/sys/src/brazil/port/proc.c /n/emeliedump/1997/0220/sys/src/brazil/port/proc.c 502a return rv; . 498a rv = 1; . 488c return rv; . 485a coherence(); /* force memory state to reflect processor state */ rv = 0; . 484c int s, rv; . 480c int . 392a coherence(); /* force memory state to reflect processor state */ . ## diffname port/proc.c 1997/0327 ## diff -e /n/emeliedump/1997/0220/sys/src/brazil/port/proc.c /n/emeliedump/1997/0327/sys/src/brazil/port/proc.c 987a iprint("%s\n", buf); . 652c cclose(up->dot); . 438c return MACHP(0)->ticks >= up->twhen || up->tfn(arg); . 367a if(procalloc.free == nil) panic("cannot allocate %d procs\n", conf.nproc); . 27,28c Proc* head; Proc* tail; . 21c Waitq* free; . 14,15c Proc* arena; Proc* free; . ## diffname port/proc.c 1997/0821 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/proc.c /n/emeliedump/1997/0821/sys/src/brazil/port/proc.c 233c if(!canlock(runq)) goto loop; . ## diffname port/proc.c 1997/1104 ## diff -e /n/emeliedump/1997/0821/sys/src/brazil/port/proc.c /n/emeliedump/1997/1104/sys/src/brazil/port/proc.c 648,649c if(up->fgrp){ fgrp = up->fgrp; up->fgrp = nil; closefgrp(fgrp); } . 644a Fgrp *fgrp; . ## diffname port/proc.c 1998/0325 ## diff -e /n/emeliedump/1997/1104/sys/src/brazil/port/proc.c /n/emeliedump/1998/0325/sys/src/brazil/port/proc.c 43a "QueueingW", . ## diffname port/proc.c 1998/0425 ## diff -e /n/emeliedump/1998/0325/sys/src/brazil/port/proc.c /n/emeliedump/1998/0425/sys/src/brazil/port/proc.c 653a qunlock(&up->debug); . 650a qlock(&up->debug); . ## diffname port/proc.c 1998/0508 ## diff -e /n/emeliedump/1998/0425/sys/src/brazil/port/proc.c /n/emeliedump/1998/0508/sys/src/brazil/port/proc.c 432a up->state = Running; } . 431c if(r->p == up){ /* undo the sleep1() */ up->r = 0; . ## diffname port/proc.c 1998/0510 ## diff -e /n/emeliedump/1998/0508/sys/src/brazil/port/proc.c /n/emeliedump/1998/0510/sys/src/brazil/port/proc.c 415a splx(s); . ## diffname port/proc.c 1998/0511 ## diff -e /n/emeliedump/1998/0510/sys/src/brazil/port/proc.c /n/emeliedump/1998/0511/sys/src/brazil/port/proc.c 436c if(up->state == Wakeme) up->state = Running; . ## diffname port/proc.c 1998/0512 ## diff -e /n/emeliedump/1998/0511/sys/src/brazil/port/proc.c /n/emeliedump/1998/0512/sys/src/brazil/port/proc.c 722c . 718c . 714c if(p->pid == up->parentpid && p->state != Broken && p->nwait < 128) { . 685c . 554c panic("postnote: state %d %d %d", r->p != p, p->r != r, p->state); . 510c if(p->state != Wakeme) . 247c if(p == 0 || p->mach){ . 66c /* . ## diffname port/proc.c 1998/0513 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/port/proc.c /n/emeliedump/1998/0513/sys/src/brazil/port/proc.c 442a splx(s); . 430,439d 409,427d 405,406c } else { /* * now we are committed to * change state and call scheduler */ up->state = Wakeme; up->r = r; /* statistics */ m->cs++; procsave(up); if(setlabel(&up->sched)) { /* * here when the process is awakened */ procrestore(up); spllo(); } else { /* * here to go to sleep (i.e. stop Running) */ unlock(&up->rlock); gotolabel(&m->sched); } . 402,403c r->p = up; coherence(); if((*f)(arg) || up->notepending){ /* * if condition happened or a note is pending * never mind */ r->p = nil; . 400c * Wakeup only knows there may be something to do by testing * r->p in order to get something to lock on. * Flush that information out to memory in case the sleep is * committed. . 397,398d 395d 389a . 385,388d 381c sleep(Rendez *r, int (*f)(void*), void *arg) . ## diffname port/proc.c 1998/0514 ## diff -e /n/emeliedump/1998/0513/sys/src/brazil/port/proc.c /n/emeliedump/1998/0514/sys/src/brazil/port/proc.c 498c /* * this makes sure that the condition sleep checks * with its (*f)(void) is visible to it */ coherence(); . 394,397c * Wakeup only knows there may be something to do by testing * r->p in order to get something to lock on. * Flush that information out to memory in case the sleep is * committed. . 379a /* * Sleep, postnote, and wakeup are complicated by the * fact that they at least one of them must indirect * through an unlocked structure to find the synchronizing * lock structure. This is because sleep() * and wakeup() share direct knowledge only of r while * sleep() and postnote() share knowledge only of p. We've * chosen to put the synchronization lock in p, i.e., * p->rlock. Therefore the interaction between sleep() * and postnote() is completely synchronized by keeping * p->rlock locked in sleep until the process has * saved all the information it needs to become dormant. * * However, wakeup() can only find what process is sleeping * by looking at r->p. A wakeup looks like: * * 1) set condition that sleep checks with (*f)() * 2) is p = r->p non zero * 3) lock(p->rlock) * 4) check r->p == p * 5) ... * * A sleep looks like * * a) lock(p->rlock) * b) r->p = up * c) check condition * d) ... * * On a multiprocessor, two processors * may not see writes occur in the same order. The coherence() * instruction ensures that a processor has flushed all its * writes to memory so that those writes will be seen by other * processors and that the processor will see all writes flushed * by other processors. * * To make the above sequence work on a multiprocessor, we need * to put a coherence() call between (1) and (2) and between * (b) and (c). That way we're guaranteed that if (1) and * (2) occur after (c), the wakeup process will know * which process is about to sleep and will enter its * critical section. If it doesn't, the sleep could proceed * while the waker returns without doing anything. * Similarly, if (b) and (c) occur after (2), * the sleeper needs coherence to see that the condition was * set. Otherwise it could sleep even though the wakeup * had already decided there was nothing to do. * * jmk & presotto */ . 84a /* * If changing this routine, look also at sleep(). It * contains a copy of the guts of sched(). */ . ## diffname port/proc.c 1998/0603 ## diff -e /n/emeliedump/1998/0514/sys/src/brazil/port/proc.c /n/emeliedump/1998/0603/sys/src/brazil/port/proc.c 269c p->movetime = m->ticks + HZ/10; . ## diffname port/proc.c 1998/0604 ## diff -e /n/emeliedump/1998/0603/sys/src/brazil/port/proc.c /n/emeliedump/1998/0604/sys/src/brazil/port/proc.c 330d 160,163d ## diffname port/proc.c 1998/0605 ## diff -e /n/emeliedump/1998/0604/sys/src/brazil/port/proc.c /n/emeliedump/1998/0605/sys/src/brazil/port/proc.c 815c /* Sched must not loop for these locks */ . 332a p->nlocks = 0; . 68a * palloc . ## diffname port/proc.c 1998/0606 ## diff -e /n/emeliedump/1998/0605/sys/src/brazil/port/proc.c /n/emeliedump/1998/0606/sys/src/brazil/port/proc.c 896c print("%3d:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux pri %d\n", . 334d 201c if((m->fairness++ & 3) == 0){ . 160a /* stick at low priority any process waiting for a lock */ if(p->lockwait) pri = PriLock; . ## diffname port/proc.c 1998/0724 ## diff -e /n/emeliedump/1998/0606/sys/src/brazil/port/proc.c /n/emeliedump/1998/0724/sys/src/brazil/port/proc.c 387c * fact that at least one of them must indirect . ## diffname port/proc.c 1998/0725 ## diff -e /n/emeliedump/1998/0724/sys/src/brazil/port/proc.c /n/emeliedump/1998/0725/sys/src/brazil/port/proc.c 923a /* * wait till all processes have flushed their mmu * state about segement s */ void procflushseg(Segment *s) { int i, ns, nm, nwait; Proc *p; /* * tell all processes with this * segment to flush their mmu's */ nwait = 0; for(i=0; istate == Dead) continue; for(ns = 0; ns < NSEG; ns++) if(p->seg[ns] == s){ p->newtlb = 1; for(nm = 0; nm < conf.nmach; nm++){ if(MACHP(nm)->proc == p){ MACHP(nm)->flushmmu = 1; nwait++; } } break; } } if(nwait == 0) return; /* * wait for all processors to take a clock interrupt * and flush their mmu's */ for(nm = 0; nm < conf.nmach; nm++) if(MACHP(nm) != m) while(MACHP(nm)->flushmmu) sched(); } . ## diffname port/proc.c 1998/0806 ## diff -e /n/emeliedump/1998/0725/sys/src/brazil/port/proc.c /n/emeliedump/1998/0806/sys/src/brazil/port/proc.c 43a "QueueingR", . ## diffname port/proc.c 1998/0825 ## diff -e /n/emeliedump/1998/0806/sys/src/brazil/port/proc.c /n/emeliedump/1998/0825/sys/src/brazil/port/proc.c 1146c print("%lud: %s killed because no swap configured\n", kp->pid, kp->text); . 981c print(" %lud(%lud, %lud)", p->pid, m->ticks - p->readytime, . 979c print("rq%ld:", rq-runq); . 912c print("up %lud\n", up->pid); . 900c print("%3lud:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux pri %lud\n", . 759c n = sprint(wq->w.msg, "%s %lud:", up->text, up->pid); . 594c print("sending %s to kproc %lud %s\n", n, p->pid, p->text); . 445c print("double sleep %lud %lud\n", r->p->pid, up->pid); . 266c print("runproc %s %lud %s\n", p->text, p->pid, statename[p->state]); . ## diffname port/proc.c 1998/0901 ## diff -e /n/emeliedump/1998/0825/sys/src/brazil/port/proc.c /n/emeliedump/1998/0901/sys/src/brazil/port/proc.c 219,233d 212,216c if(p->mp == MACHP(m->machno) || p->movetime < m->ticks) . 210a if(p->readytime < rt){ xrq = rq; rt = p->readytime; } } if(xrq != nil){ rq = xrq; p = rq->head; if(p != nil) p->movetime = 0; } } else { /* * get highest priority process that this * processor can run given affinity constraints */ for(rq = &runq[Nrq-1]; rq >= runq; rq--){ p = rq->head; if(p == 0) continue; . 201,206c if((++(m->fairness) & 3) == 0){ /* * once in a while, run process that's been waiting longest * regardless of movetime */ rt = 0xffffffff; xrq = nil; . 191a ulong rt; . 189,190c Schedq *rq, *xrq; . ## diffname port/proc.c 1998/0923 ## diff -e /n/emeliedump/1998/0901/sys/src/brazil/port/proc.c /n/emeliedump/1998/0923/sys/src/brazil/port/proc.c 221a goto found; . ## diffname port/proc.c 1999/0108 ## diff -e /n/emeliedump/1998/0923/sys/src/brazil/port/proc.c /n/emeliedump/1999/0108/sys/src/brazil/port/proc.c 805a qunlock(&up->seglock); . 798a qlock(&up->seglock); . ## diffname port/proc.c 1999/0110 ## diff -e /n/emeliedump/1999/0108/sys/src/brazil/port/proc.c /n/emeliedump/1999/0110/sys/src/brazil/port/proc.c 908c p->time[0], p->time[1], bss, p->qpc); . 906c print("%3lud:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux qpc %lux\n", . ## diffname port/proc.c 1999/0326 ## diff -e /n/emeliedump/1999/0110/sys/src/brazil/port/proc.c /n/emeliedump/1999/0326/sys/src/brazil/port/proc.c 180,181d 127,129c if(nrdy == 0) return 0; for(rq = &runq[Nrq-1]; rq > &runq[up->priority]; rq--) if(rq->head != nil) return 1; return 0; . 125c Schedq *rq; . 33d ## diffname port/proc.c 1999/0327 ## diff -e /n/emeliedump/1999/0326/sys/src/brazil/port/proc.c /n/emeliedump/1999/0327/sys/src/brazil/port/proc.c 202a idlehands(); . ## diffname port/proc.c 1999/0711 ## diff -e /n/emeliedump/1999/0327/sys/src/brazil/port/proc.c /n/emeliedump/1999/0711/sys/src/brazil/port/proc.c 360,369c if(bm < 0){ /* pick a machine to wire to */ memset(nwired, 0, sizeof(nwired)); p->wired = 0; pp = proctab(0); for(i=0; iwired; if(wm && pp->pid) nwired[wm->machno]++; } bm = 0; for(i=0; iwired == nil) . ## diffname port/proc.c 1999/0811 ## diff -e /n/emeliedump/1999/0711/sys/src/brazil/port/proc.c /n/emeliedump/1999/0811/sys/src/brazil/port/proc.c 1001c MACHP(0)->ticks - p->movetime); . 278c p->movetime = MACHP(0)->ticks + HZ/10; . 252c if(p->mp == MACHP(m->machno) || p->movetime < MACHP(0)->ticks) . 238c || p->movetime < MACHP(0)->ticks) . 204c if((++(m->fairness) & 0x3) == 0){ . ## diffname port/proc.c 2000/0115 ## diff -e /n/emeliedump/1999/0811/sys/src/brazil/port/proc.c /n/emeliedump/2000/0115/sys/src/9/port/proc.c 530c // avoid overflows at the cost of precision if(ms >= 1000000) when = ms/(1000/HZ); else when = MS2TK(ms); when += MACHP(0)->ticks; . ## diffname port/proc.c 2000/0116 ## diff -e /n/emeliedump/2000/0115/sys/src/9/port/proc.c /n/emeliedump/2000/0116/sys/src/9/port/proc.c 530c /* avoid overflows at the cost of precision */ . ## diffname port/proc.c 2000/0129 ## diff -e /n/emeliedump/2000/0116/sys/src/9/port/proc.c /n/emeliedump/2000/0129/sys/src/9/port/proc.c 564a poperror(); . 562a if(waserror()){ up->twhen = 0; nexterror(); } . ## diffname port/proc.c 2000/0325 ## diff -e /n/emeliedump/2000/0129/sys/src/9/port/proc.c /n/emeliedump/2000/0325/sys/src/9/port/proc.c 756a up->pgrp = nil; . 755a up->dot = nil; . 753a up->rgrp = nil; } . 752c up->egrp = nil; } if(up->rgrp){ . 750c if(up->egrp){ . ## diffname port/proc.c 2000/0331 ## diff -e /n/emeliedump/2000/0325/sys/src/9/port/proc.c /n/emeliedump/2000/0331/sys/src/9/port/proc.c 761,762c qunlock(&up->debug); if(fgrp) closefgrp(fgrp); if(egrp) closeegrp(egrp); if(rgrp) closergrp(rgrp); if(dot) cclose(dot); if(pgrp) closepgrp(pgrp); . 743,759c /* nil out all the resources under lock (free later) */ qlock(&up->debug); fgrp = up->fgrp; up->fgrp = nil; egrp = up->egrp; up->egrp = nil; rgrp = up->rgrp; up->rgrp = nil; pgrp = up->pgrp; up->pgrp = nil; dot = up->dot; . 739a Egrp *egrp; Rgrp *rgrp; Pgrp *pgrp; Chan *dot; . ## diffname port/proc.c 2000/0519 ## diff -e /n/emeliedump/2000/0331/sys/src/9/port/proc.c /n/emeliedump/2000/0519/sys/src/9/port/proc.c 620,621c // if(p->kp) // print("sending %s to kproc %lud %s\n", n, p->pid, p->text); . ## diffname port/proc.c 2000/0714 ## diff -e /n/emeliedump/2000/0519/sys/src/9/port/proc.c /n/emeliedump/2000/0714/sys/src/9/port/proc.c 11c struct Procalloc . ## diffname port/proc.c 2000/0919 ## diff -e /n/emeliedump/2000/0714/sys/src/9/port/proc.c /n/emeliedump/2000/0919/sys/src/9/port/proc.c 636,644c /* this loop is to avoid lock ordering problems. */ for(;;){ s = splhi(); lock(&p->rlock); r = p->r; /* waiting for a wakeup? */ if(r == nil) break; /* no */ /* try for the second lock */ if(canlock(r)){ if(p->state != Wakeme || r->p != p) panic("postnote: state %d %d %d", r->p != p, p->r != r, p->state); p->r = nil; r->p = nil; ready(p); unlock(r); break; } /* give other process time to get out of critical section and try again */ unlock(&p->rlock); splx(s); sched(); . 620,622d 609a /* * if waking a sleeping process, this routine must hold both * p->rlock and r->lock. However, it can't know them in * the same order as wakeup causing a possible lock ordering * deadlock. We break the deadlock by giving up the p->rlock * lock if we can't get the r->lock and retrying. */ . 604c unlock(r); . 601a unlock(&p->rlock); . 599c r->p = nil; p->r = nil; . 595,597c lock(r); p = r->p; if(p != nil){ lock(&p->rlock); if(p->state != Wakeme || p->r != r) . 593d 588,591d 581,586d 573c * Expects that only one process can call wakeup for any given Rendez. * We hold both locks to ensure that r->p and p->r remain consistent. * Richard Miller has a better solution that doesn't require both to * be held simultaneously, but I'm a paranoid - presotto. . 504a unlock(r); . 481a unlock(r); . 473d 459a lock(r); . 416,451c * we lock both the process and the rendezvous to keep r->p * and p->r synchronized. . 404,414c * sleep if a condition is not true. Another process will * awaken us after it sets the condition. When we awaken * the condition may no longer be true. . 402d ## diffname port/proc.c 2000/1018 ## diff -e /n/emeliedump/2000/0919/sys/src/9/port/proc.c /n/emeliedump/2000/1018/sys/src/9/port/proc.c 1058a p->newtlb = 1; . ## diffname port/proc.c 2000/1026 ## diff -e /n/emeliedump/2000/1018/sys/src/9/port/proc.c /n/emeliedump/2000/1026/sys/src/9/port/proc.c 330c p->fpstate = FPINIT; . ## diffname port/proc.c 2000/1027 ## diff -e /n/emeliedump/2000/1026/sys/src/9/port/proc.c /n/emeliedump/2000/1027/sys/src/9/port/proc.c 330c p->fpstate = FPinit; . ## diffname port/proc.c 2000/1106 ## diff -e /n/emeliedump/2000/1027/sys/src/9/port/proc.c /n/emeliedump/2000/1106/sys/src/9/port/proc.c 941c prflush(); . ## diffname port/proc.c 2000/1130 ## diff -e /n/emeliedump/2000/1106/sys/src/9/port/proc.c /n/emeliedump/2000/1130/sys/src/9/port/proc.c 242a idlehands(); . 203d ## diffname port/proc.c 2001/0207 ## diff -e /n/emeliedump/2000/1130/sys/src/9/port/proc.c /n/emeliedump/2001/0207/sys/src/9/port/proc.c 556c rv = p; . 540,541c Proc *p, *rv; int s; . 537c Proc* . ## diffname port/proc.c 2001/0217 ## diff -e /n/emeliedump/2001/0207/sys/src/9/port/proc.c /n/emeliedump/2001/0217/sys/src/9/port/proc.c 1016c p->psstate = "kproc"; . 919c s = statename[p->state]; . ## diffname port/proc.c 2001/0315 ## diff -e /n/emeliedump/2001/0217/sys/src/9/port/proc.c /n/emeliedump/2001/0315/sys/src/9/port/proc.c 162,168c /* stick at low priority any process waiting for a lock */ if(p->lockwait) pri = PriLock; } . 154,160c /* history counts */ if(p->state == Running){ p->rt++; pri = ((p->art + (p->rt<<1))>>2)/Squantum; } else { p->art = (p->art + (p->rt<<1))>>2; p->rt = 0; pri = p->art/Squantum; } pri = p->basepri - pri; if(pri < 0) pri = 0; /* the only intersection between the classes is at PriNormal */ if(pri < PriNormal && p->basepri > PriNormal) pri = PriNormal; . 149,152c if(p->fixedpri){ pri = p->basepri; . ## diffname port/proc.c 2001/0510 ## diff -e /n/emeliedump/2001/0315/sys/src/9/port/proc.c /n/emeliedump/2001/0510/sys/src/9/port/proc.c 1214a } static void pidhash(Proc *p) { int h; h = p->pid % nelem(procalloc.ht); lock(&procalloc); p->pidhash = procalloc.ht[h]; procalloc.ht[h] = p; unlock(&procalloc); } static void pidunhash(Proc *p) { int h; Proc **l; h = p->pid % nelem(procalloc.ht); lock(&procalloc); for(l = &procalloc.ht[h]; *l != nil; l = &(*l)->pidhash) if(*l == p){ *l = p->pidhash; break; } unlock(&procalloc); } int procindex(int pid) { Proc *p; int h; int s; s = -1; h = pid % nelem(procalloc.ht); lock(&procalloc); for(p = procalloc.ht[h]; p != nil; p = p->pidhash) if(p->pid == pid){ s = p - procalloc.arena; break; } unlock(&procalloc); return s; . 827a pidunhash(up); . 344a pidhash(p); . 50a static void pidhash(Proc*); static void pidunhash(Proc*); . 13a Proc* ht[128]; . ## diffname port/proc.c 2001/0527 ## diff -e /n/emeliedump/2001/0510/sys/src/9/port/proc.c /n/emeliedump/2001/0527/sys/src/9/port/proc.c 1252c procindex(ulong pid) . 1191,1192c if(p->user!=nil && strcmp(old, p->user)==0) kstrdup(&p->user, new); . 1137c char buf[ERRMAX]; . 1124c strncpy(up->error, err, ERRMAX); . 1057,1058d 1051c kstrdup(&p->user, eve); kstrdup(&p->text, name); . 1026,1027c p->psstate = 0; p->procmode = 0640; . 951d 787,788c strncpy(wq->w.msg+n, exitstr, sizeof wq->w.msg-n); wq->w.msg[sizeof wq->w.msg-1] = 0; . 346a kstrdup(&p->user, "*nouser"); kstrdup(&p->text, "*notext"); kstrdup(&p->args, ""); p->nargs = 0; . 33,35d 31a static Schedq runq[Nrq]; . 19,24d 17c } procalloc; . 11c static Ref pidalloc; static struct Procalloc . 8c int nrdy; . ## diffname port/proc.c 2001/0529 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/proc.c /n/emeliedump/2001/0529/sys/src/9/port/proc.c 571c return p; . 563d 550d 547c Proc *p; . ## diffname port/proc.c 2001/0717 ## diff -e /n/emeliedump/2001/0529/sys/src/9/port/proc.c /n/emeliedump/2001/0717/sys/src/9/port/proc.c 478c if(up->kp) print("attempt to interrupt %ld %s\n", up->pid, up->text); else error(Eintr); . ## diffname port/proc.c 2001/0802 ## diff -e /n/emeliedump/2001/0717/sys/src/9/port/proc.c /n/emeliedump/2001/0802/sys/src/9/port/proc.c 1056,1057d 326a p->parent = 0; . ## diffname port/proc.c 2001/0819 ## diff -e /n/emeliedump/2001/0802/sys/src/9/port/proc.c /n/emeliedump/2001/0819/sys/src/9/port/proc.c 903c cpid = wq->w.pid; . 776,789c wq->w.pid = up->pid; wq->w.time[TUser] = utime = up->time[TUser] + up->time[TCUser]; wq->w.time[TSys] = stime = up->time[TSys] + up->time[TCSys]; wq->w.time[TReal] = TK2MS(MACHP(0)->ticks - up->time[TReal]); if(exitstr && exitstr[0]) snprint(wq->w.msg, sizeof(wq->w.msg), "%s %lud: %s", up->text, up->pid, exitstr); . 720d ## diffname port/proc.c 2001/0822 ## diff -e /n/emeliedump/2001/0819/sys/src/9/port/proc.c /n/emeliedump/2001/0822/sys/src/9/port/proc.c 1111c kstrcpy(up->error, err, sizeof up->error); . 341a p->syserror[0] = '\0'; . ## diffname port/proc.c 2001/0924 ## diff -e /n/emeliedump/2001/0822/sys/src/9/port/proc.c /n/emeliedump/2001/0924/sys/src/9/port/proc.c 1112c kstrcpy(up->errstr, err, ERRMAX); . 341,342c p->errstr = p->errbuf0; p->syserrstr = p->errbuf1; p->errbuf0[0] = '\0'; p->errbuf1[0] = '\0'; . ## diffname port/proc.c 2001/1117 ## diff -e /n/emeliedump/2001/0924/sys/src/9/port/proc.c /n/emeliedump/2001/1117/sys/src/9/port/proc.c 340a p->privatemem = 0; . ## diffname port/proc.c 2001/1218 ## diff -e /n/emeliedump/2001/1117/sys/src/9/port/proc.c /n/emeliedump/2001/1218/sys/src/9/port/proc.c 483,486c error(Eintr); . ## diffname port/proc.c 2002/0114 ## diff -e /n/emeliedump/2001/1218/sys/src/9/port/proc.c /n/emeliedump/2002/0114/sys/src/9/port/proc.c 405c panic("cannot allocate %lud procs\n", conf.nproc); . ## diffname port/proc.c 2002/0228 ## diff -e /n/emeliedump/2002/0114/sys/src/9/port/proc.c /n/emeliedump/2002/0228/sys/src/9/port/proc.c 159c pri = p->basepri - (pri/Squantum); . 157d 155c p->art = (p->art + p->rt + 2)/2; pri = (p->art + p->rt)/2; . 153c pri = (p->art + p->rt)/2; . 136c Squantum = 1, . ## diffname port/proc.c 2002/0315 ## diff -e /n/emeliedump/2002/0228/sys/src/9/port/proc.c /n/emeliedump/2002/0315/sys/src/9/port/proc.c 1098a if (isedf(up)) edf_block(up); . 846a if (isedf(up)) edf_bury(up); . 679a if (isedf(up)) edf_bury(up); . 569d 475a // Behind unlock, we may call wakeup on ourselves. if (isedf(up)) edf_block(up); . 462c . 358a p->task = nil; . 281a . 196a if ((p = edf_runproc()) != nil) return p; . 162c . 146a if(isedf(p)){ edf_ready(p); splx(s); return; } . 130c . 116c return nrdy || edf_anyready(); . 79c up = nil; . 63a if (isedf(up)) edf_bury(up); . 43a "Released", . 31c { /* BUG: generate automatically */ . 21,27d 6a #include "../port/edf.h" . ## diffname port/proc.c 2002/0326 ## diff -e /n/emeliedump/2002/0315/sys/src/9/port/proc.c /n/emeliedump/2002/0326/sys/src/9/port/proc.c 516,521c when = ms2tk(ms) + MACHP(0)->ticks; . 509a ulong ms2tk(ulong ms) { /* avoid overflows at the cost of precision */ if(ms >= 1000000000/HZ) return (ms/1000)*HZ; return (ms+500)*HZ/1000; } . ## diffname port/proc.c 2002/0328 ## diff -e /n/emeliedump/2002/0326/sys/src/9/port/proc.c /n/emeliedump/2002/0328/sys/src/9/port/proc.c 349a p->lockwait = nil; . ## diffname port/proc.c 2002/0329 ## diff -e /n/emeliedump/2002/0328/sys/src/9/port/proc.c /n/emeliedump/2002/0329/sys/src/9/port/proc.c 517c return (ms*HZ+500)/1000; . ## diffname port/proc.c 2002/0402 ## diff -e /n/emeliedump/2002/0329/sys/src/9/port/proc.c /n/emeliedump/2002/0402/sys/src/9/port/proc.c 1122,1123d 868,869d 699,700d 489,490d 201,203d 146,150d 115c return nrdy; . 60,62d 7d ## diffname port/proc.c 2002/0403 ## diff -e /n/emeliedump/2002/0402/sys/src/9/port/proc.c /n/emeliedump/2002/0403/sys/src/9/port/proc.c 93c if(setlabel(&up->sched)){ . 86c if(up){ if(up->state == Running && up->nlocks){ up->delaysched++; delayedscheds++; return; } . 10a long delayedscheds; /* statistics */ . ## diffname port/proc.c 2002/0404 ## diff -e /n/emeliedump/2002/0403/sys/src/9/port/proc.c /n/emeliedump/2002/0404/sys/src/9/port/proc.c 1111a if (isedf(up)) edf_block(up); . 937c p->time[0], p->time[1], bss, p->qpc, p->nlocks, p->delaysched, p->lastlock ? p->lastlock->pc : 0); . 935c print("%3lud:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux qpc %lux nl %lud nd %lud lpc %lux\n", . 859a if (isedf(up)) edf_bury(up); . 692a if (isedf(up)) edf_bury(up); . 485a if (isedf(up)) edf_block(up); . 483d 435a if (up->nlocks) print("process %lud sleeps with %lud locks held, last lock 0x%p locked at pc 0x%lux\n", up->pid, up->nlocks, up->lastlock, up->lastlock->pc); . 350a p->nlocks = 0; p->delaysched = 0; . 199a if ((p = edf_runproc()) != nil) return p; . 149a if(isedf(p)){ edf_ready(p); splx(s); return; } . 148a #ifdef RSC le('r',p); #endif . 119c return nrdy || edf_anyready(); . 108a #ifdef RSC le('u',up); #endif . 75a #ifdef RSC le('e', up); #endif . 59a if (isedf(up)) edf_bury(up); . 44a /*DEBUGGING: scheduling event log */ #ifdef RSC static ulong *lg; enum {Nlg = 1024*1024}; static ulong wp, rp; static void le(int c, Proc *p) { if(lg==nil) lg = malloc(Nlg*sizeof(lg[0])); lg[wp++&(Nlg-1)] = MACHP(0)->ticks; lg[wp++&(Nlg-1)] = c; lg[wp++&(Nlg-1)] = (ulong)p; } void dumpschedlog(void) { int i; i=0; iprint("%lux=>%lux\n", rp, wp); while((rp&(Nlg-1))!=(wp&(Nlg-1))){ iprint("%lux ", lg[rp++&(Nlg-1)]); if(++i%8==0) iprint("\n"); } if(i%8) iprint("\n"); } #endif . 6a #include "../port/edf.h" . ## diffname port/proc.c 2002/0406 ## diff -e /n/emeliedump/2002/0404/sys/src/9/port/proc.c /n/emeliedump/2002/0406/sys/src/9/port/proc.c 146,148d 110,112d ## diffname port/proc.c 2002/0410 ## diff -e /n/emeliedump/2002/0406/sys/src/9/port/proc.c /n/emeliedump/2002/0410/sys/src/9/port/proc.c 1169c edfblock(up); . 915c edfbury(up); . 746c edfbury(up); . 536c edfblock(up); . 242c if ((p = edfrunproc()) != nil) . 188c edfready(p); . 183,185d 153c return nrdy || edfanyready(); . 93c edfbury(up); . 46,76d 7d ## diffname port/proc.c 2002/0413 ## diff -e /n/emeliedump/2002/0410/sys/src/9/port/proc.c /n/emeliedump/2002/0413/sys/src/9/port/proc.c 1148a setlabel(&up->errlab[NERR-1]); . ## diffname port/proc.c 2002/0414 ## diff -e /n/emeliedump/2002/0413/sys/src/9/port/proc.c /n/emeliedump/2002/0414/sys/src/9/port/proc.c 92d ## diffname port/proc.c 2002/0415 ## diff -e /n/emeliedump/2002/0414/sys/src/9/port/proc.c /n/emeliedump/2002/0415/sys/src/9/port/proc.c 361a p->movetime = 0; . 266c if(p->mp == MACHP(m->machno) || p->movetime <= MACHP(0)->ticks) . ## diffname port/proc.c 2002/0416 ## diff -e /n/emeliedump/2002/0415/sys/src/9/port/proc.c /n/emeliedump/2002/0416/sys/src/9/port/proc.c 91a up->delaysched = 1; . ## diffname port/proc.c 2002/0420 ## diff -e /n/emeliedump/2002/0416/sys/src/9/port/proc.c /n/emeliedump/2002/0420/sys/src/9/port/proc.c 91,93c if(up->nlocks && up->state != Moribund){ delayedscheds++; . 89a if(m->ilockdepth) panic("ilockdepth %d", m->ilockdepth); . ## diffname port/proc.c 2002/0501 ## diff -e /n/emeliedump/2002/0420/sys/src/9/port/proc.c /n/emeliedump/2002/0501/sys/src/9/port/proc.c 812,813c utime = up->time[TUser] + up->time[TCUser]; stime = up->time[TSys] + up->time[TCSys]; wq->w.time[TUser] = TK2MS(utime); wq->w.time[TSys] = TK2MS(stime); . ## diffname port/proc.c 2002/0502 ## diff -e /n/emeliedump/2002/0501/sys/src/9/port/proc.c /n/emeliedump/2002/0502/sys/src/9/port/proc.c 1058a p->noswap = 1; . 357a p->noswap = 0; . ## diffname port/proc.c 2002/0506 ## diff -e /n/emeliedump/2002/0502/sys/src/9/port/proc.c /n/emeliedump/2002/0506/sys/src/9/port/proc.c 1196c if(l > max && strcmp(p->text, "kfs") != 0){ . ## diffname port/proc.c 2002/0626 ## diff -e /n/emeliedump/2002/0506/sys/src/9/port/proc.c /n/emeliedump/2002/0626/sys/src/9/port/proc.c 91c panic("ilockdepth %d, last lock 0x%p at 0x%lux", m->ilockdepth, up?up->lastilock:nil, (up && up->lastilock)?up->lastilock->pc:0); . ## diffname port/proc.c 2002/0704 ## diff -e /n/emeliedump/2002/0626/sys/src/9/port/proc.c /n/emeliedump/2002/0704/sys/src/9/port/proc.c 1142,1143c if (edf->isedf(up)) edf->edfblock(up); . 887,888c if (edf->isedf(up)) edf->edfbury(up); . 716,717c if (edf->isedf(up)) edf->edfbury(up); . 506,507c if (edf->isedf(up)) edf->edfblock(up); . 211c if ((p = edf->edfrunproc()) != nil) . 156,157c if(edf->isedf(p)){ edf->edfready(p); . 125c return nrdy || edf->edfanyready(); . 60,61c if (edf->isedf(up)) edf->edfbury(up); . 24a extern Edfinterface nulledf; Edfinterface *edf = &nulledf; . ## diffname port/proc.c 2002/0710 ## diff -e /n/emeliedump/2002/0704/sys/src/9/port/proc.c /n/emeliedump/2002/0710/sys/src/9/port/proc.c 821,823c wq->w.time[TUser] = tk2ms(utime); wq->w.time[TSys] = tk2ms(stime); wq->w.time[TReal] = tk2ms(MACHP(0)->ticks - up->time[TReal]); . 532,540d ## diffname port/proc.c 2002/0821 ## diff -e /n/emeliedump/2002/0710/sys/src/9/port/proc.c /n/emeliedump/2002/0821/sys/src/9/port/proc.c 1249a /* calculate decaying duty cycle average */ m->avginidle = (m->avginidle*(HZ-1)+m->inidle)/HZ; m->inidle = 0; . 1247d 1231,1232c ulong n; static ulong nrun; . 303a if(start) m->inidle += fastticks(nil)-start; . 264a if(start == 0) start = fastticks(nil); . 214a start = 0; . 213a uvlong start; . ## diffname port/proc.c 2002/0822 ## diff -e /n/emeliedump/2002/0821/sys/src/9/port/proc.c /n/emeliedump/2002/0822/sys/src/9/port/proc.c 1256,1259d 1246a /* calculate decaying duty cycles */ n = perfticks(); per = n - m->perf.last; m->perf.last = n; if(per == 0) per = 1; m->perf.period = (m->perf.period*(HZ-1)+per)/HZ; m->perf.avg_inidle = (m->perf.avg_inidle*(HZ-1)+m->perf.inidle)/HZ; m->perf.inidle = 0; m->perf.avg_inintr = (m->perf.avg_inintr*(HZ-1)+m->perf.inintr)/HZ; m->perf.inintr = 0; . 1238c ulong n, per; . 309,310d 270a now = perfticks(); m->perf.inidle += now-start; start = now; . 268,269c /* remember how much time we're here */ . 216c start = perfticks(); . 214c ulong start, now; . ## diffname port/proc.c 2002/0925 ## diff -e /n/emeliedump/2002/0822/sys/src/9/port/proc.c /n/emeliedump/2002/0925/sys/src/9/port/proc.c 97c (up && up->lastilock)?up->lastilock->pc:0, getcallerpc(x+3)); . 95c panic("ilockdepth %d, last lock 0x%p at 0x%lux, sched called from 0x%lux", . 93a int x[1]; . ## diffname port/proc.c 2002/1010 ## diff -e /n/emeliedump/2002/0925/sys/src/9/port/proc.c /n/emeliedump/2002/1010/sys/src/9/port/proc.c 1254,1256c per = (m->perf.period*(HZ-1) + per)/HZ; if(per != 0) m->perf.period = per; . ## diffname port/proc.c 2002/1104 ## diff -e /n/emeliedump/2002/1010/sys/src/9/port/proc.c /n/emeliedump/2002/1104/sys/src/9/port/proc.c 386a p->setargs = 0; . ## diffname port/proc.c 2003/0214 ## diff -e /n/emeliedump/2002/1104/sys/src/9/port/proc.c /n/emeliedump/2003/0214/sys/src/9/port/proc.c 231c if(!unfair && (++(m->fairness) & 0x3) == 0){ . 11a int unfair; /* unfair scheduling */ . ## diffname port/proc.c 2003/0226 ## diff -e /n/emeliedump/2003/0214/sys/src/9/port/proc.c /n/emeliedump/2003/0226/sys/src/9/port/proc.c 232c if((++(m->fairness) & 0x3) == 0){ . 12d ## diffname port/proc.c 2003/0228 ## diff -e /n/emeliedump/2003/0226/sys/src/9/port/proc.c /n/emeliedump/2003/0228/sys/src/9/port/proc.c 1086,1087c procpriority(p, PriKproc, 0); . 1050,1051c print(" %lud(%lud)", p->pid, m->ticks - p->readytime); . 972c p->time[0], p->time[1], bss, p->qpc, p->nlocks, p->delaysched, p->lastlock ? p->lastlock->pc : 0, p->priority); . 970c print("%3lud:%10s pc %8lux dbgpc %8lux %8s (%s) ut %ld st %ld bss %lux qpc %lux nl %lud nd %lud lpc %lux pri %lud\n", . 437a procpriority(Proc *p, int pri, int fixed) { if(pri >= Nrq) pri = Nrq - 1; else if(pri < 0) pri = 0; p->basepri = pri; p->priority = pri; if(fixed){ p->quanta = 0xfffff; p->fixedpri = 1; } else { p->quanta = quanta[pri]; p->fixedpri = 0; } } void . 433d 396a /* sched params */ p->mp = 0; p->wired = 0; procpriority(p, PriNormal, 0); . 382d 375d 369,371d 310,311d 302a if(rq->head == nil) runvec &= ~(1<<(rq-runq)); . 285c if(p->mp == MACHP(m->machno) || (!p->wired && i > 0)) . 272a /* remember how much time we're here */ . 271d 247,268d 230,245c for(i = 0;; i++){ /* * get highest priority process that this * processor can run given affinity constraints */ for(rq = &runq[Nrq-1]; rq >= runq; rq--){ p = rq->head; if(p == 0) continue; for(; p; p = p->rnext){ if(p->mp == MACHP(m->machno) || (!p->wired && i > 0)) goto found; . 227c * or one that hasn't moved in a while (load balancing). Every * time around the loop affinity goes down. . 224d 216a int i; . 215d 213c Schedq *rq; . 203a runvec |= 1<quanta = quanta[pri]; . 170,177c if(p->quanta > quanta[pri]/2){ /* blocked before using half its quanta, go up */ if(++pri > p->basepri) pri = p->basepri; . 168a p->quanta = HZ; } else if(p->state == Running){ if(p->quanta <= 0){ /* degrade priority of anyone that used their whole quanta */ /* processes > PriNormal and those below don't mix */ if(p->basepri > PriNormal){ if(pri > PriNormal) pri--; } else { if(pri > 0) pri--; } p->quanta = quanta[pri]; } . 166a pri = p->priority; . 151,152c if(up && up->state == Running) if(up->preempted == 0) if(anyhigher()) if(!active.exiting){ up->preempted = 1; sched(); splhi(); up->preempted = 0; return 1; } return 0; } . 149c /* * here at the end of non-clock interrupts to see if we should preempt the * current process. Returns 1 if preempted, 0 otherwise. */ int preempted(void) . 146c /* don't bother unless someone is elegible */ if(anyhigher() || (!up->fixedpri && anyready())){ sched(); splhi(); } . 142,144c /* edf scheduler always gets first chance */ if(edf->isedf(up)) return; . 139,140c /* * here once per clock tick to see if we should resched */ void hzsched(void) { /* another cycle, another quantum */ up->quanta--; . 137c return runvec & ~((1<<(up->priority+1))-1); } . 131c return runvec || edf->edfanyready(); . 23a static ulong runvec; static int quanta[Nrq] = { Q+19*DQ, Q+18*DQ, Q+17*DQ, Q+16*DQ, Q+15*DQ, Q+14*DQ, Q+13*DQ, Q+12*DQ, Q+11*DQ, Q+10*DQ, Q+ 9*DQ, Q+ 8*DQ, Q+ 7*DQ, Q+ 6*DQ, Q+ 5*DQ, Q+ 4*DQ, Q+ 3*DQ, Q+ 2*DQ, Q+ 1*DQ, Q+ 0*DQ, }; . 22a enum { Q=(HZ/20)*4, DQ=((HZ-Q)/40)*2, }; . ## diffname port/proc.c 2003/0301 ## diff -e /n/emeliedump/2003/0228/sys/src/9/port/proc.c /n/emeliedump/2003/0301/sys/src/9/port/proc.c 305c if(p == tp) . 302a /* * the queue may have changed before we locked runq, * refind the target process. */ . 289a /* waste time or halt the CPU */ . 284,285c for(; tp; tp = tp->rnext){ if(tp->mp == nil || tp->mp == MACHP(m->machno) || (!tp->wired && i > 0)) . 281,282c tp = rq->head; if(tp == 0) . 277c * find the highest priority target process that this . 259c Proc *p, *l, *tp; . 217,225c if(pri > 0) pri--; . 194a /* * ready(p) picks a new priority for a process and sticks it in the * runq for that priority. * * - fixed priority processes never move * - a process that uses all its quanta before blocking goes down a * priority level * - a process that uses less than half its quanta before blocking * goes up a priority level * - a process that blocks after using up half or more of it's quanta * stays at the same level * * new quanta are assigned each time a process blocks or changes level */ . ## diffname port/proc.c 2003/0314 ## diff -e /n/emeliedump/2003/0301/sys/src/9/port/proc.c /n/emeliedump/2003/0314/sys/src/9/port/proc.c 288,291c for(tp = rq->head; tp; tp = tp->rnext){ if(tp->yield){ tp->yield = 0; continue; } . 285c * processor can run given affinity constraints. * . 261a /* * yield the processor to any other runnable process */ void yield(void) { if(anyready()){ up->yield = 1; sched(); } } /* * pick a process to run */ . ## diffname port/proc.c 2003/0316 ## diff -e /n/emeliedump/2003/0314/sys/src/9/port/proc.c /n/emeliedump/2003/0316/sys/src/9/port/proc.c 328,359d 326c p = dequeueproc(rq, p); if(p == nil) . 304,310c for(p = rq->head; p; p = p->rnext){ if(p->mp == nil || p->mp == MACHP(m->machno) || (!p->wired && i > 0)) . 289a if(m->fairness++ == 10){ m->fairness = 0; rebalance(); } . 281c Proc *p; . 274a * move up any process waiting more than its quanta */ static void rebalance(void) { Schedq *rq; Proc *p; for(rq = runq; rq < &runq[Nrq]; rq++){ p = rq->head; if(p == nil) continue; if(p->mp != MACHP(m->machno)) continue; if(p->priority == p->basepri) continue; if(m->ticks - p->readytime < quanta[p->priority]/4) continue; splhi(); p = dequeueproc(rq, p); spllo(); if(p == nil) continue; p->quanta = quanta[p->priority]; /* act like we used none */ ready(p); } } /* . 269c up->quanta = 0; /* act like you used them all up */ . 264a static Proc* dequeueproc(Schedq *rq, Proc *tp) { Proc *l, *p; if(!canlock(runq)) return nil; /* * the queue may have changed before we locked runq, * refind the target process. */ l = 0; for(p = rq->head; p; p = p->rnext){ if(p == tp) break; l = p; } /* * p->mach==0 only when process state is saved */ if(p == 0 || p->mach){ unlock(runq); return nil; } if(p->rnext == 0) rq->tail = l; if(l) l->rnext = p->rnext; else rq->head = p->rnext; if(rq->head == nil) runvec &= ~(1<<(rq-runq)); rq->n--; nrdy--; if(p->state != Ready) print("dequeueproc %s %lud %s\n", p->text, p->pid, statename[p->state]); unlock(runq); return p; } /* * yield the processor and drop our priority */ . 263c * remove a process from a scheduling queue (called splhi) . ## diffname port/proc.c 2003/0319 ## diff -e /n/emeliedump/2003/0316/sys/src/9/port/proc.c /n/emeliedump/2003/0319/sys/src/9/port/proc.c 364a /* 10 is completely arbitrary - it interacts with the comparison in rebalance */ /* presotto */ . 336a /* this comparison is too arbitrary - need a better one */ /* presotto */ . ## diffname port/proc.c 2003/0406 ## diff -e /n/emeliedump/2003/0319/sys/src/9/port/proc.c /n/emeliedump/2003/0406/sys/src/9/port/proc.c 1263c if(edf->isedf(up)) . 1010c if(edf->isedf(up)) . 839c if(edf->isedf(up)) . 638c if(edf->isedf(up)) . 636d 586c if(up->nlocks) . 365c if((p = edf->edfrunproc()) != nil) . 79c if(edf->isedf(up)) .