no swplo
[unix-history] / usr / src / sys / kern / kern_clock.c
index e2706fa..158a9a8 100644 (file)
@@ -1,4 +1,4 @@
-/*     kern_clock.c    3.2     %H%     */
+/*     %H%     3.12    kern_clock.c    */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
  *     jab the scheduler
  */
 #ifdef KPROF
  *     jab the scheduler
  */
 #ifdef KPROF
-short  kcount[20000];
+unsigned short kcount[20000];
 #endif
 
 #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;
 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
 
        /*
         * reprime clock
@@ -88,6 +95,24 @@ caddr_t pc;
         * and time of day
         */
 out:
         * 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;
        if (!noproc) {
                s = u.u_procp->p_rssize;
                u.u_vm.vm_idsrss += s;
@@ -100,25 +125,26 @@ out:
                if (s > u.u_vm.vm_maxrss)
                        u.u_vm.vm_maxrss = s;
        }
                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)
        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 {
        } else {
-               a += 16;
+               cpstate = CP_SYS;
                if (noproc)
                if (noproc)
-                       a += 8;
+                       cpstate = CP_IDLE;
                else
                        u.u_vm.vm_stime++;
        }
                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) {
        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;
                }
                        if (pp->p_pri >= PUSER)
                                pp->p_pri = pp->p_usrpri;
                }
@@ -133,7 +159,7 @@ out:
                        return;
                lbolt -= HZ;
                ++time;
                        return;
                lbolt -= HZ;
                ++time;
-               VOID spl1();
+               (void) spl1();
                runrun++;
                wakeup((caddr_t)&lbolt);
                for(pp = &proc[0]; pp < &proc[NPROC]; pp++)
                runrun++;
                wakeup((caddr_t)&lbolt);
                for(pp = &proc[0]; pp < &proc[NPROC]; pp++)
@@ -144,12 +170,20 @@ out:
                                if(--pp->p_clktim == 0)
                                        if (pp->p_flag & STIMO) {
                                                s = spl6();
                                if(--pp->p_clktim == 0)
                                        if (pp->p_flag & STIMO) {
                                                s = spl6();
-                                               if (pp->p_stat == SSLEEP)
+                                               switch (pp->p_stat) {
+
+                                               case SSLEEP:
                                                        setrun(pp);
                                                        setrun(pp);
+                                                       break;
+
+                                               case SSTOP:
+                                                       unsleep(pp);
+                                                       break;
+                                               }
                                                pp->p_flag &= ~STIMO;
                                                splx(s);
                                        } else
                                                pp->p_flag &= ~STIMO;
                                                splx(s);
                                        } else
-                                               psignal(pp, SIGCLK);
+                                               psignal(pp, SIGALRM);
                        if(pp->p_stat==SSLEEP||pp->p_stat==SSTOP)
                                if (pp->p_slptime != 127)
                                        pp->p_slptime++;
                        if(pp->p_stat==SSLEEP||pp->p_stat==SSTOP)
                                if (pp->p_slptime != 127)
                                        pp->p_slptime++;
@@ -163,7 +197,7 @@ out:
                        if(a > 255)
                                a = 255;
                        pp->p_cpu = a;
                        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) &&
                        s = spl6();
                        if(pp->p_pri >= PUSER) {
                                if ((pp != u.u_procp || noproc) &&
@@ -198,11 +232,13 @@ out:
                        if (pp->p_uid)
                                if (pp->p_nice == NZERO && u.u_vm.vm_utime > 600 * HZ)
                                        pp->p_nice = NZERO+4;
                        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
        }
                        pp->p_pri = pp->p_usrpri;
                }
 #endif
        }
+       if (!BASEPRI(ps))
+               unhang();
        if (USERMODE(ps)) {
                /*
                 * We do this last since it
        if (USERMODE(ps)) {
                /*
                 * We do this last since it
@@ -213,10 +249,11 @@ out:
        }
 #ifdef KPROF
        else if (!noproc) {
        }
 #ifdef KPROF
        else if (!noproc) {
-               register int indx = ((int)pc & 0x7fffffff) / 8;
+               register int indx = ((int)pc & 0x7fffffff) / 4;
 
                if (indx >= 0 && indx < 20000)
 
                if (indx >= 0 && indx < 20000)
-                       kcount[indx]++;
+                       if (++kcount[indx] == 0)
+                               --kcount[indx];
        }
 #endif
 }
        }
 #endif
 }