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

1.1       root        1: /* psend.c - psend */
                      2: 
                      3: #include <conf.h>
                      4: #include <kernel.h>
                      5: #include <mark.h>
                      6: #include <ports.h>
                      7: 
                      8: /*------------------------------------------------------------------------
                      9:  *  psend  --  send a message to a port by enqueuing it
                     10:  *------------------------------------------------------------------------
                     11:  */
                     12: SYSCALL        psend(portid, msg)
                     13: int    portid;
1.1.1.2 ! root       14: WORD   msg;
1.1       root       15: {
                     16:        struct  pt      *ptptr;
                     17:        int     seq;
                     18:        struct  ptnode  *freenode;
                     19:        
                     20: 
1.1.1.2 ! root       21: #ifdef DEBUG
        !            22:        dotrace("psend", &portid, 2);
        !            23: #endif
        !            24:        disable();
1.1       root       25:        if ( isbadport(portid) ||
                     26: #ifdef MEMMARK
                     27:             unmarked(ptmark) ||
                     28: #endif
                     29:             (ptptr= &ports[portid])->ptstate != PTALLOC ) {
1.1.1.2 ! root       30:                restore();
1.1       root       31:                return(SYSERR);
                     32:        }
                     33: 
                     34:        /* wait for space and verify port is still allocated */
                     35: 
                     36:        seq = ptptr->ptseq;
                     37:        if (wait(ptptr->ptssem) == SYSERR
                     38:            || ptptr->ptstate != PTALLOC
                     39:            || ptptr->ptseq != seq) {
1.1.1.2 ! root       40:                restore();
        !            41:                return(SYSERR);
        !            42:        }
        !            43:        if (ptfree == NULL) {
        !            44:                kprintf("Ports  -  out of nodes");
1.1       root       45:                return(SYSERR);
                     46:        }
                     47:        freenode = ptfree;
                     48:        ptfree  = freenode->ptnext;
1.1.1.2 ! root       49:        freenode->ptnext = (struct ptnode *) NULL;
1.1       root       50:        freenode->ptmsg  = msg;
1.1.1.2 ! root       51:        if (ptptr->pttail == (struct ptnode *) NULL)    /* empty queue */
1.1       root       52:                ptptr->pttail = ptptr->pthead = freenode;
                     53:        else {
                     54:                (ptptr->pttail)->ptnext = freenode;
                     55:                ptptr->pttail = freenode;
                     56:        }
                     57:        signal(ptptr->ptrsem);
1.1.1.2 ! root       58:        restore();
1.1       root       59:        return(OK);
                     60: }

unix.superglobalmegacorp.com

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