Annotation of xinu/sys/screate.c, revision 1.1.1.2

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.