1: # include "ctlmod.h"
2: # include "pipes.h"
3: # include <sccs.h>
4:
5: SCCSID(@(#)do_st.c 8.1 12/31/84)
6:
7: /*
8: ** DO_ST -- do a state.
9: **
10: ** This routine does a state as indicated by ppb, handing it
11: ** pc & pv as parameters. The state must be known already.
12: **
13: ** If the state is local, it calls 'call_fn' to actually
14: ** do the setup and call the function.
15: ** If the state is remote, it uses send_off to send ppb
16: ** to the process that can do it.
17: **
18: ** It returns the next state to execute, possibly PB_UNKNOWN.
19: **
20: ** Parameters:
21: ** ppb -- a pipe block which identifies the state
22: ** to call, etc.
23: ** pc -- the pc to hand to the function.
24: ** pv -- the pv to had to the function.
25: **
26: ** Returns:
27: ** none (except through ppb)
28: **
29: ** Side Effects:
30: ** *ppb gets set to identify the next state.
31: ** Resp is set if local function.
32: **
33: ** Called By:
34: ** do_seq
35: **
36: ** Trace Flags:
37: ** 2.8 - 2.15
38: */
39:
40: do_st(ppb, pc, pv)
41: register pb_t *ppb;
42: int pc;
43: PARM *pv;
44: {
45: register state_t *s;
46: register int i;
47: int rtval;
48:
49: i = ppb->pb_st;
50: s = &Cm.cm_state[i];
51: if (i < 0 || i > CM_MAXST || s->st_type == ST_UNDEF)
52: syserr("do_st: undef state %d", i);
53: # ifdef xCTR1
54: if (tTf(2, 8))
55: lprintf("do_st: state %d type %d mark %d\n",
56: i, s->st_type, markbuf(Qbuf));
57: # endif
58:
59: switch (s->st_type)
60: {
61: case ST_REMOT:
62: /*
63: ** Remote: determine the correct process and send
64: ** it on its way.
65: */
66:
67: ppb->pb_proc = s->st_v.st_rem.st_proc;
68: send_off(ppb, pc, pv);
69: pb_flush(ppb);
70: rtval = PB_UNKNOWN;
71: break;
72:
73: case ST_LOCAL:
74: /*
75: ** Local: execute the function using 'call_fn'
76: ** and compute next state.
77: ** If call originated in this process, set the EOF bit
78: ** so we don't try to read this pipe later.
79: */
80:
81: if (bitset(PB_FRFR, ppb->pb_stat) && !bitset(ST_EXTERN, s->st_stat))
82: syserr("do_st: restricted state %d", i);
83: if (ppb->pb_from == Cm.cm_myproc)
84: setbit(PB_EOF, ppb->pb_stat);
85: call_fn(s->st_v.st_loc.st_funcno, pc, pv);
86: rtval = s->st_v.st_loc.st_next;
87: break;
88:
89: default:
90: syserr("do_st: type %d", s->st_type);
91: }
92:
93: # ifdef xCTR1
94: if (tTf(2, 10))
95: lprintf("do_st: ret %d mark %d\n", rtval, markbuf(Qbuf));
96: # endif
97: return (rtval);
98: }
Defined functions
do_st
defined in line
5; used 1 times