|
|
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: int sem;
17:
1.1.1.2 ! root 18: disable();
1.1 root 19: if ( count<0 || (sem=newsem())==SYSERR ) {
1.1.1.2 ! root 20: restore();
1.1 root 21: return(SYSERR);
22: }
23: semaph[sem].semcnt = count;
24: /* sqhead and sqtail were initialized at system startup */
1.1.1.2 ! root 25: restore();
1.1 root 26: return(sem);
27: }
28:
29: /*------------------------------------------------------------------------
30: * newsem -- allocate an unused semaphore and return its index
31: *------------------------------------------------------------------------
32: */
33: LOCAL newsem()
34: {
35: int sem;
36: int i;
37:
38: for (i=0 ; i<NSEM ; i++) {
39: sem=nextsem--;
40: if (nextsem < 0)
41: nextsem = NSEM-1;
42: if (semaph[sem].sstate==SFREE) {
43: semaph[sem].sstate = SUSED;
44: return(sem);
45: }
46: }
47: return(SYSERR);
48: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.