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

1.1     ! root        1: # include      "ctlmod.h"
        !             2: # include      "pipes.h"
        !             3: # include      <resp.h>
        !             4: # include      <sccs.h>
        !             5: 
        !             6: SCCSID(@(#)do_seq.c    7.1     2/5/81)
        !             7: 
        !             8: /*
        !             9: **  DO_SEQ -- do sequence of states
        !            10: **
        !            11: **     The sequence of states indicated by the start state
        !            12: **     ppb->pb_st is executed.
        !            13: **
        !            14: **     Recursion and multiple processes are implemented in
        !            15: **     this routine.  For each iteration through the top
        !            16: **     loop, the next state to call is checked.  If the state
        !            17: **     is local (in this process), the state is executed and
        !            18: **     the next state is computed.  If the state is remote,
        !            19: **     (contained in another process), we write out the
        !            20: **     current call on a pipe which will (eventually) get
        !            21: **     to the target process.  In this case (and the system
        !            22: **     reset case) the next state is unknown.  This causes
        !            23: **     this routine to read the input pipe for a command.
        !            24: **     The command read is then executed -- notice that it
        !            25: **     does not matter if this command is part of this level
        !            26: **     of call (a sibling of the 'call'd process) or a lower
        !            27: **     level (a descendent), since 'call' saved the state.
        !            28: **
        !            29: **     If there are no more states in the chain after execution
        !            30: **     of a local state, then a response block is generated.
        !            31: **     The 'readinput' call can also generate one of these.
        !            32: **     If the return is local (to this process), it is just
        !            33: **     returned.  Otherwise, it sends it off to the process
        !            34: **     currently blocked for this state sequence to complete,
        !            35: **     and the PB_UNKNOWN state is reentered.
        !            36: **
        !            37: **     Parameters:
        !            38: **             ppb -- a pointer to the pipe block which
        !            39: **                     (a) describes the state to call and
        !            40: **                     (b) provides an I/O area.
        !            41: **
        !            42: **     Returns:
        !            43: **             none
        !            44: **
        !            45: **     Side Effects:
        !            46: **             Lots.  The side effects of all the states.
        !            47: **             Leaves 'Resp' set to the response of the last
        !            48: **                     state in the chain.
        !            49: **
        !            50: **     Called By:
        !            51: **             call
        !            52: **             main
        !            53: **
        !            54: **     Trace Flags:
        !            55: **             2.0 - 2.7
        !            56: */
        !            57: 
        !            58: do_seq(ppb)
        !            59: register pb_t  *ppb;
        !            60: {
        !            61:        register int    i;
        !            62: 
        !            63:        /*
        !            64:        **  Top Loop.
        !            65:        **      Iterate until we have a response block intended
        !            66:        **      for this process (and hence this state, since
        !            67:        **      state invocations are properly nested inside
        !            68:        **      process invocations).
        !            69:        **      We also insure that we can always get at the
        !            70:        **      current pipe block.
        !            71:        **
        !            72:        **      We return from the setjmp with non-zero value if
        !            73:        **      we get a fatal error.
        !            74:        */
        !            75: 
        !            76:        Ctx.ctx_ppb = ppb;
        !            77:        if (setjmp(Ctx.ctx_jbuf) != 0)
        !            78:                return;
        !            79: 
        !            80:        for (;;)
        !            81:        {
        !            82: # ifdef xCTR1
        !            83:                if (tTf(2, 0))
        !            84:                        lprintf("do_seq: state %d\n", ppb->pb_st);
        !            85: # endif
        !            86:                /* take cases */
        !            87:                switch (ppb->pb_st)
        !            88:                {
        !            89:                  case PB_UNKNOWN:
        !            90:                        /*
        !            91:                        **  Read the input and get a state, since we
        !            92:                        **  don't have one already.  This will set
        !            93:                        **  Parmc & Parmv and change *ppb.  The
        !            94:                        **  state it found will be processed next
        !            95:                        **  time through the loop.
        !            96:                        */
        !            97: 
        !            98:                        readinput(ppb);
        !            99:                        break;
        !           100: 
        !           101:                  case PB_NONE:
        !           102:                        /*
        !           103:                        **  The 'no next state' case, i.e., a response.
        !           104:                        **      This only happens if the response is
        !           105:                        **      for this process, so we just return.
        !           106:                        */
        !           107: 
        !           108: # ifdef xCTR1
        !           109:                        if (tTf(2, 1))
        !           110:                                lprintf("do_seq: exit\n");
        !           111: # endif
        !           112:                        return;
        !           113: 
        !           114:                  default:
        !           115:                        /*
        !           116:                        ** The state is known, let do_st do all
        !           117:                        ** the dirty work.  Hand it the global
        !           118:                        ** Parmc & Parmv to pass to the function.
        !           119:                        ** Do_st returns the next state to execute.
        !           120:                        */
        !           121: 
        !           122:                        ppb->pb_st = i = do_st(ppb, Ctx.ctx_pc, Ctx.ctx_pv);
        !           123:                        if (i == PB_NONE)
        !           124:                        {
        !           125: # ifdef xCM_DEBUG
        !           126:                                if (ppb->pb_resp == PB_UNKNOWN)
        !           127:                                        syserr("do_seq: pb_resp");
        !           128: # endif
        !           129:                                ppb->pb_proc = ppb->pb_resp;
        !           130:                                if (ppb->pb_proc != Cm.cm_myproc)
        !           131:                                {
        !           132:                                        /* write to correct process */
        !           133:                                        pb_prime(ppb, PB_RESP);
        !           134:                                        send_off(ppb, 0, (PARM *)NULL);
        !           135:                                        pb_flush(ppb);
        !           136: 
        !           137:                                        /* next state is unknown */
        !           138:                                        ppb->pb_st = PB_UNKNOWN;
        !           139:                                }
        !           140:                        }
        !           141:                        break;
        !           142:                }
        !           143:        }
        !           144: }

unix.superglobalmegacorp.com

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