|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.