|
|
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; ! 14: int msg; ! 15: { ! 16: PStype ps; ! 17: struct pt *ptptr; ! 18: int seq; ! 19: struct ptnode *freenode; ! 20: ! 21: ! 22: disable(ps); ! 23: if ( isbadport(portid) || ! 24: #ifdef MEMMARK ! 25: unmarked(ptmark) || ! 26: #endif ! 27: (ptptr= &ports[portid])->ptstate != PTALLOC ) { ! 28: restore(ps); ! 29: return(SYSERR); ! 30: } ! 31: ! 32: /* wait for space and verify port is still allocated */ ! 33: ! 34: seq = ptptr->ptseq; ! 35: if (wait(ptptr->ptssem) == SYSERR ! 36: || ptptr->ptstate != PTALLOC ! 37: || ptptr->ptseq != seq) { ! 38: restore(ps); ! 39: return(SYSERR); ! 40: } ! 41: if (ptfree == (struct ptnode *)NULL) ! 42: panic("psend: out of nodes"); ! 43: freenode = ptfree; ! 44: ptfree = freenode->ptnext; ! 45: freenode->ptnext = (struct ptnode *)NULL; ! 46: freenode->ptmsg = msg; ! 47: if (ptptr->pttail == (struct ptnode *)NULL) /* empty queue */ ! 48: ptptr->pttail = ptptr->pthead = freenode; ! 49: else { ! 50: (ptptr->pttail)->ptnext = freenode; ! 51: ptptr->pttail = freenode; ! 52: } ! 53: signal(ptptr->ptrsem); ! 54: restore(ps); ! 55: return(OK); ! 56: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.