|
|
1.1 ! root 1: /* wait.c - wait */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <proc.h> ! 6: #include <q.h> ! 7: #include <sem.h> ! 8: ! 9: /*------------------------------------------------------------------------ ! 10: * wait -- make current process wait on a semaphore ! 11: *------------------------------------------------------------------------ ! 12: */ ! 13: SYSCALL wait(sem) ! 14: int sem; ! 15: { ! 16: PStype ps; ! 17: register struct sentry *sptr; ! 18: register struct pentry *pptr; ! 19: ! 20: disable(ps); ! 21: if (isbadsem(sem) || (sptr= &semaph[sem])->sstate==SFREE) { ! 22: restore(ps); ! 23: return(SYSERR); ! 24: } ! 25: if (--(sptr->semcnt) < 0) { ! 26: (pptr = &proctab[currpid])->pstate = PRWAIT; ! 27: pptr->psem = sem; ! 28: enqueue(currpid,sptr->sqtail); ! 29: resched(); ! 30: } ! 31: restore(ps); ! 32: return(OK); ! 33: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.