added tsleep()
authorBill Joy <bill@ucbvax.Berkeley.EDU>
Tue, 15 Apr 1980 10:19:53 +0000 (02:19 -0800)
committerBill Joy <bill@ucbvax.Berkeley.EDU>
Tue, 15 Apr 1980 10:19:53 +0000 (02:19 -0800)
SCCS-vsn: sys/kern/kern_synch.c 3.4

usr/src/sys/kern/kern_synch.c

index 4a63a89..826cde6 100644 (file)
@@ -1,4 +1,4 @@
-/*     kern_synch.c    3.3     %H%     */
+/*     kern_synch.c    3.4     %H%     */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -78,6 +78,50 @@ psig:
        /*NOTREACHED*/
 }
 
        /*NOTREACHED*/
 }
 
+/*
+ * Sleep on chan at pri.
+ * Return in no more than the indicated number of seconds.
+ * (If seconds==0, no timeout implied)
+ * Return      TS_OK if chan was awakened normally
+ *             TS_TIME if timeout occurred
+ *             TS_SIG if asynchronous signal occurred
+ */
+tsleep(chan, pri, seconds)
+caddr_t chan;
+{
+       label_t lqsav;
+       register struct proc *pp;
+       register sec, n, rval;
+
+       pp = u.u_procp;
+       sec = 0;
+       rval = 0;
+       n = spl7();
+       if (pp->p_clktim && pp->p_clktim<seconds)
+               seconds = 0;
+       if (seconds) {
+               pp->p_flag |= STIMO;
+               if ((sec = pp->p_clktim-seconds) < 0)
+                       sec = 0;
+               pp->p_clktim = seconds;
+       }
+       bcopy((caddr_t)u.u_qsav, (caddr_t)lqsav, sizeof (label_t));
+       if (setjmp(u.u_qsav))
+               rval = TS_SIG;
+       else {
+               sleep(chan, pri);
+               if ((pp->p_flag&STIMO)==0 && seconds)
+                       rval = TS_TIME;
+               else
+                       rval = TS_OK;
+       }
+       pp->p_flag &= ~STIMO;
+       bcopy((caddr_t)lqsav, (caddr_t)u.u_qsav, sizeof (label_t));
+       pp->p_clktim += sec;
+       splx(n);
+       return(rval);
+}
+
 /*
  * Wake up all processes sleeping on chan.
  */
 /*
  * Wake up all processes sleeping on chan.
  */