Annotation of 42BSD/ingres/source/ctlmod/call.c, revision 1.1

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: }

unix.superglobalmegacorp.com

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