|
|
1.1 root 1: /* screate.c - screate, newsem */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <proc.h>
6: #include <q.h>
7: #include <sem.h>
8:
9: /*------------------------------------------------------------------------
10: * screate -- create and initialize a semaphore, returning its id
11: *------------------------------------------------------------------------
12: */
13: SYSCALL screate(count)
14: int count; /* initial count (>=0) */
15: {
16: PStype ps;
17: int sem;
18:
19: disable(ps);
20: if ( count<0 || (sem=newsem())==SYSERR ) {
21: restore(ps);
22: return(SYSERR);
23: }
24: semaph[sem].semcnt = count;
25: /* sqhead and sqtail were initialized at system startup */
26: restore(ps);
27: return(sem);
28: }
29:
30: /*------------------------------------------------------------------------
31: * newsem -- allocate an unused semaphore and return its index
32: *------------------------------------------------------------------------
33: */
34: LOCAL newsem()
35: {
36: int sem;
37: int i;
38:
39: for (i=0 ; i<NSEM ; i++) {
40: sem=nextsem--;
41: if (nextsem < 0)
42: nextsem = NSEM-1;
43: if (semaph[sem].sstate==SFREE) {
44: semaph[sem].sstate = SUSED;
45: return(sem);
46: }
47: }
48: return(SYSERR);
49: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.