/* unsleep.c - unsleep */ #include <conf.h> #include <kernel.h> #include <proc.h> #include <q.h> #include <sleep.h> /*------------------------------------------------------------------------ * unsleep -- remove process from the sleep queue prematurely *------------------------------------------------------------------------ */ SYSCALL unsleep(pid) int pid; { struct pentry *pptr; struct qent *qptr; int remain; int next; char ps; disable(ps); if (isbadpid(pid) || ( (pptr = &proctab[pid])->pstate != PRSLEEP && pptr->pstate != PRTRECV) ) { restore(ps); return(SYSERR); } qptr = &q[pid]; remain = qptr->qkey; if ( (next=qptr->qnext) < NPROC) q[next].qkey += remain; dequeue(pid); if ( (next=q[clockq].qnext) < NPROC) sltop = (int *) & q[next].qkey; else slnempty = FALSE; restore(ps); return(OK); }