]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/port/proc.c
import E script from bell labs
[plan9front.git] / sys / src / 9 / port / proc.c
index 9a9649d9f48fbd02bd25cae51b7b99497c81520c..03eb69da47e5f96f0004c91d762bb51f5174b7e9 100644 (file)
@@ -173,6 +173,9 @@ sched(void)
        up->state = Running;
        up->mach = MACHP(m->machno);
        m->proc = up;
+       //print("poolcheck sched %s\n", p->text);
+       //#include <pool.h>
+       //poolcheck(mainmem);
        mmuswitch(up);
        gotolabel(&up->sched);
 }
@@ -1387,7 +1390,7 @@ kproc(char *name, void (*func)(void *), void *arg)
        p->s = up->s;
        p->nerrlab = 0;
        p->slash = up->slash;
-       p->dot = up->dot;
+       p->dot = up->slash;     /* unlike fork, do not inherit the dot for kprocs */
        if(p->dot != nil)
                incref(p->dot);
 
@@ -1420,12 +1423,12 @@ kproc(char *name, void (*func)(void *), void *arg)
  *  reasoning.
  */
 void
-procctl(Proc *p)
+procctl(void)
 {
        char *state;
        ulong s;
 
-       switch(p->procctl) {
+       switch(up->procctl) {
        case Proc_exitbig:
                spllo();
                pprint("Killed: Insufficient physical memory\n");
@@ -1436,26 +1439,26 @@ procctl(Proc *p)
                pexit("Killed", 1);
 
        case Proc_traceme:
-               if(p->nnote == 0)
+               if(up->nnote == 0)
                        return;
                /* No break */
 
        case Proc_stopme:
-               p->procctl = 0;
-               state = p->psstate;
-               p->psstate = "Stopped";
+               up->procctl = 0;
+               state = up->psstate;
+               up->psstate = "Stopped";
                /* free a waiting debugger */
                s = spllo();
-               qlock(&p->debug);
-               if(p->pdbg != nil) {
-                       wakeup(&p->pdbg->sleep);
-                       p->pdbg = nil;
+               qlock(&up->debug);
+               if(up->pdbg != nil) {
+                       wakeup(&up->pdbg->sleep);
+                       up->pdbg = nil;
                }
-               qunlock(&p->debug);
+               qunlock(&up->debug);
                splhi();
-               p->state = Stopped;
+               up->state = Stopped;
                sched();
-               p->psstate = state;
+               up->psstate = state;
                splx(s);
                return;
        }
@@ -1552,11 +1555,17 @@ killbig(char *why)
        kp->procctl = Proc_exitbig;
        for(i = 0; i < NSEG; i++) {
                s = kp->seg[i];
-               if(s != nil) {
-                       qlock(s);
-                       mfreeseg(s, s->base, (s->top - s->base)/BY2PG);
-                       qunlock(s);
+               if(s == nil)
+                       continue;
+               switch(s->type & SG_TYPE){
+               case SG_SHARED:
+               case SG_PHYSICAL:
+               case SG_FIXED:
+                       continue;
                }
+               qlock(s);
+               mfreeseg(s, s->base, (s->top - s->base)/BY2PG);
+               qunlock(s);
        }
        qunlock(&kp->seglock);
 }
@@ -1596,14 +1605,14 @@ accounttime(void)
        n = perfticks();
        per = n - m->perf.last;
        m->perf.last = n;
-       per = (m->perf.period*(HZ-1) + per)/HZ;
+       per = ((uvlong)m->perf.period*(HZ-1) + per)/HZ;
        if(per != 0)
                m->perf.period = per;
 
-       m->perf.avg_inidle = (m->perf.avg_inidle*(HZ-1)+m->perf.inidle)/HZ;
+       m->perf.avg_inidle = ((uvlong)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.avg_inintr = ((uvlong)m->perf.avg_inintr*(HZ-1)+m->perf.inintr)/HZ;
        m->perf.inintr = 0;
 
        /* only one processor gets to compute system load averages */
@@ -1621,8 +1630,9 @@ accounttime(void)
         */
        n = nrun;
        nrun = 0;
-       n = (nrdy+n)*1000;
-       m->load = (m->load*(HZ-1)+n)/HZ;
+       n = (nrdy+n)*1000*100;
+       load = ((uvlong)load*(HZ-1)+n)/HZ;
+       m->load = load/100;
 }
 
 int