X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/83be5fac09a163709674e8ea22c0f7e289773ae2..054016e18b2e08c194346e08571394ec2308c3a9:/usr/src/sys/kern/kern_clock.c diff --git a/usr/src/sys/kern/kern_clock.c b/usr/src/sys/kern/kern_clock.c index 5a50f6928e..4535d2f36c 100644 --- a/usr/src/sys/kern/kern_clock.c +++ b/usr/src/sys/kern/kern_clock.c @@ -1,7 +1,8 @@ -/* kern_clock.c 3.1 %H% */ +/* %H% 3.14 kern_clock.c */ #include "../h/param.h" #include "../h/systm.h" +#include "../h/dk.h" #include "../h/callo.h" #include "../h/seg.h" #include "../h/dir.h" @@ -30,16 +31,23 @@ * jab the scheduler */ #ifdef KPROF -short kcount[20000]; +unsigned short kcount[20000]; #endif +/* + * We handle regular calls to the dh and dz silo input processors + * without using timeouts to save a little time. + */ +int rintvl = 0; /* every 1/60'th of sec check receivers */ +int rcnt; + clock(pc, ps) caddr_t pc; { register struct callo *p1, *p2; register struct proc *pp; register int s; - int a; + int a, cpstate; /* * reprime clock @@ -88,6 +96,24 @@ caddr_t pc; * and time of day */ out: + + /* + * In order to not take input character interrupts to use + * the input silo on DZ's we have to guarantee to echo + * characters regularly. This means that we have to + * call the timer routines predictably. Since blocking + * in these routines is at spl5(), we have to make spl5() + * really spl6() blocking off the clock to put this code + * here. Note also that it is critical that we run spl5() + * (i.e. really spl6()) in the receiver interrupt routines + * so we can't enter them recursively and transpose characters. + */ + if (rcnt >= rintvl) { + dhtimer(); + dztimer(); + rcnt = 0; + } else + rcnt++; if (!noproc) { s = u.u_procp->p_rssize; u.u_vm.vm_idsrss += s; @@ -100,25 +126,26 @@ out: if (s > u.u_vm.vm_maxrss) u.u_vm.vm_maxrss = s; } - a = dk_busy&07; if (USERMODE(ps)) { u.u_vm.vm_utime++; if(u.u_procp->p_nice > NZERO) - a += 8; + cpstate = CP_NICE; + else + cpstate = CP_USER; } else { - a += 16; + cpstate = CP_SYS; if (noproc) - a += 8; + cpstate = CP_IDLE; else u.u_vm.vm_stime++; } - dk_time[a]++; + dk_time[cpstate][dk_busy&(DK_NSTATES-1)]++; if (!noproc) { pp = u.u_procp; if(++pp->p_cpu == 0) pp->p_cpu--; if(pp->p_cpu % 16 == 0) { - VOID setpri(pp); + (void) setpri(pp); if (pp->p_pri >= PUSER) pp->p_pri = pp->p_usrpri; } @@ -133,7 +160,7 @@ out: return; lbolt -= HZ; ++time; - VOID spl1(); + (void) spl1(); runrun++; wakeup((caddr_t)&lbolt); for(pp = &proc[0]; pp < &proc[NPROC]; pp++) @@ -142,7 +169,22 @@ out: pp->p_time++; if(pp->p_clktim) if(--pp->p_clktim == 0) - psignal(pp, SIGCLK); + if (pp->p_flag & STIMO) { + s = spl6(); + switch (pp->p_stat) { + + case SSLEEP: + setrun(pp); + break; + + case SSTOP: + unsleep(pp); + break; + } + pp->p_flag &= ~STIMO; + splx(s); + } else + psignal(pp, SIGALRM); if(pp->p_stat==SSLEEP||pp->p_stat==SSTOP) if (pp->p_slptime != 127) pp->p_slptime++; @@ -156,7 +198,7 @@ out: if(a > 255) a = 255; pp->p_cpu = a; - VOID setpri(pp); + (void) setpri(pp); s = spl6(); if(pp->p_pri >= PUSER) { if ((pp != u.u_procp || noproc) && @@ -185,17 +227,21 @@ out: */ if (bclnlist != NULL) wakeup((caddr_t)&proc[2]); -#ifdef ERNIE if (USERMODE(ps)) { pp = u.u_procp; +#ifdef ERNIE if (pp->p_uid) if (pp->p_nice == NZERO && u.u_vm.vm_utime > 600 * HZ) pp->p_nice = NZERO+4; - VOID setpri(pp); + (void) setpri(pp); pp->p_pri = pp->p_usrpri; - } #endif + if (u.u_vm.vm_utime+u.u_vm.vm_stime > u.u_limit[LIM_CPU]) + psignal(pp, SIGXCPU); + } } + if (!BASEPRI(ps)) + unhang(); if (USERMODE(ps)) { /* * We do this last since it @@ -206,10 +252,11 @@ out: } #ifdef KPROF else if (!noproc) { - register int indx = ((int)pc & 0x7fffffff) / 8; + register int indx = ((int)pc & 0x7fffffff) / 4; if (indx >= 0 && indx < 20000) - kcount[indx]++; + if (++kcount[indx] == 0) + --kcount[indx]; } #endif }