|
|
1.1 ! root 1: # include "ctlmod.h" ! 2: # include "pipes.h" ! 3: # include <resp.h> ! 4: # include <ingres.h> ! 5: # include <aux.h> ! 6: # include <tree.h> ! 7: # include <sccs.h> ! 8: ! 9: SCCSID(@(#)call.c 7.1 2/5/81) ! 10: ! 11: /* ! 12: ** CALL -- Call a state with return. ! 13: ** ! 14: ** The state indicated by the indicated entry point is ! 15: ** called. Control will return to the current state. ! 16: ** ! 17: ** If errflg is non-NULL, it is the address of a function ! 18: ** which is willing to handle error messages. If it is ! 19: ** NULL, the parent of this module (and so forth) will ! 20: ** handle the error message. ! 21: ** ! 22: ** To call a module, the user should call 'initp' to ! 23: ** initialize a context in which the called module will ! 24: ** be executed. Parameters should then be initialized, ! 25: ** and then the module should be called. For instance: ! 26: ** initp(); ! 27: ** init_qt(qmode); [only if we have a qtree parameter] ! 28: ** setp(PV_QTREE, qt, 0); ! 29: ** setp(PV_INT, ISAM, 0); ! 30: ** setp(PV_TUPLE, tup, tupsiz); ! 31: ** call(mdCREATE, catcherr); ! 32: ** ! 33: ** Alternatively, the 'call' can be replaced with: ! 34: ** calln(mdCREATE, catcherr); ! 35: ** [save the return value if desired -- not in Qbuf!] ! 36: ** resetp(); ! 37: ** ! 38: ** Parameters: ! 39: ** entpt -- the entry point; indicates the starting ! 40: ** state. If zero, this is an error block. ! 41: ** errfn -- the address of an error function; ! 42: ** NULL indicates to pass errors to the ! 43: ** parent's error handling function. ! 44: ** ! 45: ** Returns: ! 46: ** The return value of the final called state. ! 47: ** ! 48: ** Side Effects: ! 49: ** Sets 'Resp' to be the response vector for the ! 50: ** final called function. ! 51: ** ! 52: ** Trace Flags: ! 53: ** 5 ! 54: */ ! 55: ! 56: call(entpt, errfn) ! 57: int entpt; ! 58: int (*errfn)(); ! 59: { ! 60: calln(entpt, errfn); ! 61: resetp(); ! 62: return (Resp.resp_resp); ! 63: } ! 64: /* ! 65: ** CALLN -- just like a call, but keep the context around ! 66: ** ! 67: ** Parameters: ! 68: ** (see call) ! 69: ** ! 70: ** Returns: ! 71: ** (see call) ! 72: ** ! 73: ** Side Effects: ! 74: ** (see call) ! 75: */ ! 76: ! 77: calln(entpt, errfn) ! 78: int entpt; ! 79: int (*errfn)(); ! 80: { ! 81: pb_t pb; ! 82: # ifdef xMONITOR ! 83: extern struct monitor CmMonBuf; ! 84: extern struct monitor MonBuf[]; ! 85: struct monitor *savemon; ! 86: struct monitor mon; ! 87: extern struct monitor *markperf(); ! 88: # endif MONITOR ! 89: ! 90: # ifdef xCTR1 ! 91: if (tTf(5, 0)) ! 92: lprintf("call: %d\n", entpt); ! 93: # endif ! 94: # ifdef xMONITOR ! 95: savemon = markperf(&CmMonBuf); ! 96: # endif xMONITOR ! 97: ! 98: /* ! 99: ** Select the starting state. ! 100: */ ! 101: ! 102: if (entpt >= CM_MAXST || entpt < 0) ! 103: syserr("call: entpt %d", entpt); ! 104: ! 105: /* ! 106: ** Do final setup on context. ! 107: ** Set up the pipe buffer to use in this call. ! 108: ** Flag the end of the parmvect. ! 109: ** Save the error function address. ! 110: ** Save the monitor struct address. This monitor struct ! 111: ** will save the collective results of this ! 112: ** module & all children. ! 113: */ ! 114: ! 115: pb_prime(&pb, PB_REG); ! 116: call_setup(&pb, entpt, errfn); ! 117: # ifdef xMONITOR ! 118: Ctx.ctx_mon = &mon; ! 119: clrmem(&mon, sizeof mon); ! 120: # endif xMONITOR ! 121: ! 122: /* ! 123: ** Do the sequence. ! 124: */ ! 125: ! 126: # ifdef xCTR1 ! 127: if (tTf(5, 2)) ! 128: lprintf("call: ENT %d cmark %d pmark %d\n", ! 129: pb.pb_st, Ctx.ctx_cmark, Ctx.ctx_pmark); ! 130: # endif ! 131: ! 132: Ctx.ctx_new = FALSE; ! 133: do_seq(&pb); ! 134: Ctx.ctx_new = TRUE; ! 135: ! 136: # ifdef xMONITOR ! 137: markperf(savemon); ! 138: Resp.resp_time = mon.mon_utime + mon.mon_stime; ! 139: # endif xMONITOR ! 140: ! 141: # ifdef xCTR1 ! 142: if (tTf(5, 3)) ! 143: { ! 144: lprintf("call: EXIT entpt %d st %d\n", entpt, pb.pb_st); ! 145: printf("\tresp %7d\ttime %7ld\ttups %6ld\n", ! 146: Resp.resp_resp, Resp.resp_time, Resp.resp_tups); ! 147: printf("\tpread %6ld\tpwrit %6ld\n", ! 148: Resp.resp_pread, Resp.resp_pwrit); ! 149: } ! 150: # endif ! 151: ! 152: /* ! 153: ** Return the result of the final function in the chain. ! 154: */ ! 155: ! 156: return (Resp.resp_resp); ! 157: } ! 158: /* ! 159: ** CALL_SETUP -- Do final setup for call ! 160: ** ! 161: ** This routine just does the final setup before the main ! 162: ** part of a call. It is broken off here because it is ! 163: ** also used by 'error'. ! 164: ** ! 165: ** Parameters: ! 166: ** ppb -- pointer to a pipe block to use for this ! 167: ** call. ! 168: ** state -- state we are going to enter. ! 169: ** errfn -- a pointer to the error function to use ! 170: ** for this call -- NULL if we want to send ! 171: ** to our parent. ! 172: ** ! 173: ** Returns: ! 174: ** none. ! 175: ** ! 176: ** Side Effects: ! 177: ** Does setup on *ppb, Ctx, and Resp. ! 178: ** ! 179: ** Called By: ! 180: ** call ! 181: ** error ! 182: ** ! 183: ** Trace Flags: ! 184: ** none. ! 185: */ ! 186: ! 187: call_setup(ppb, state, errfn) ! 188: register pb_t *ppb; ! 189: int state; ! 190: int (*errfn)(); ! 191: { ! 192: # ifdef xCTR1 ! 193: if (tTf(5, 5)) ! 194: { ! 195: lprintf("call_setup: st %d errfn %x\n", state, errfn); ! 196: prvect(Ctx.ctx_pc, Ctx.ctx_pv); ! 197: } ! 198: # endif ! 199: ppb->pb_st = state; ! 200: ppb->pb_resp = Cm.cm_myproc; ! 201: Ctx.ctx_pv[Ctx.ctx_pc].pv_type = PV_EOF; ! 202: Ctx.ctx_pv[Ctx.ctx_pc].pv_val.pv_str = NULL; ! 203: Ctx.ctx_ppb = ppb; ! 204: Ctx.ctx_errfn = errfn; ! 205: Ctx.ctx_init = FALSE; ! 206: /* ! 207: Resp.resp_rval.pv_type = PV_EOF; ! 208: */ ! 209: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.