Annotation of 42BSD/ingres/source/ctlmod/proc_err.c, revision 1.1.1.1

1.1       root        1: # include      "ctlmod.h"
                      2: # include      "pipes.h"
                      3: # include      <sccs.h>
                      4: 
                      5: SCCSID(@(#)proc_err.c  7.1     2/5/81)
                      6: 
                      7: /*
                      8: **  PROC_ERR -- Process error message
                      9: **
                     10: **     This routine processes an error.  It searches back through
                     11: **     the chain of contexts until it finds one that is willing to
                     12: **     process this error, or it finds that it must transfer the
                     13: **     error to another process to handle it.
                     14: **
                     15: **     It also unwinds the tree of
                     16: **     activations.  It leaves us in the context that processes
                     17: **     the error, or the state that should be reading the
                     18: **     input pipe.
                     19: **
                     20: **     The local error handling function returns zero if the
                     21: **     error should be ignored, anything else otherwise.
                     22: **
                     23: **     Parameters:
                     24: **             pc -- error parameter count.
                     25: **             pv -- error parameter vector.
                     26: **             ppb -- a pointer to a pipe block to use in
                     27: **                     sending this error.
                     28: **
                     29: **     Returns:
                     30: **             none.
                     31: **
                     32: **     Side Effects:
                     33: **             Unwinds the list of activations.
                     34: **             The input pipe can be changed under certain
                     35: **                     circumstances.
                     36: **
                     37: **     Trace Flags:
                     38: **             6.8 - 6.15
                     39: */
                     40: 
                     41: 
                     42: proc_err(ppb, pc, pv)
                     43: pb_t   *ppb;
                     44: int    pc;
                     45: PARM   pv[];
                     46: {
                     47:        register struct fn_def  *f;
                     48:        extern char             *Proc_name;
                     49:        register int            i;
                     50:        register ctx_t          *ctx;
                     51:        extern pb_t             *MonPpb;
                     52: 
                     53: # ifdef xCTR2
                     54:        if (tTf(6, 8))
                     55:                lprintf("proc_err: new = %d\n", Ctx.ctx_new);
                     56: # endif
                     57:        pb_prime(ppb, PB_ERR);
                     58: 
                     59:        /*
                     60:        **  Scan back on the list of context dependencies.
                     61:        **      If we come to someone who can process this message,
                     62:        **      we go ahead and do it.  We also take this
                     63:        **      opportunity to unwind the context list & call the
                     64:        **      cleanup functions.
                     65:        */
                     66: 
                     67:        for (ctx = &Ctx; ctx != NULL; ctx = ctx->ctx_link)
                     68:        {
                     69:                Proc_name = ctx->ctx_name;
                     70:                f = ctx->ctx_fn;
                     71: # ifdef xCTR2
                     72:                if (tTf(6, 9))
                     73:                        lprintf("proc_err: unwinding %s: errfn=%x, ppb=%x, link=%x, resp=%d, fn=%x\n",
                     74:                            Proc_name, ctx->ctx_errfn, ctx->ctx_ppb,
                     75:                            ctx->ctx_link, ctx->ctx_resp, f);
                     76: # endif
                     77: 
                     78:                /*  Do the actual error processing. */
                     79:                ppb->pb_proc = ctx->ctx_resp;
                     80:                if (ctx->ctx_errfn != NULL)
                     81:                        i = (*ctx->ctx_errfn)(pc, pv);
                     82:                else
                     83:                        i = -1;
                     84: 
                     85: # ifdef xCTR2
                     86:                if (tTf(6, 11))
                     87:                        lprintf("proc_err: errcode %d\n", i);
                     88: # endif
                     89:                if (i == 0)
                     90:                        break;
                     91:                else if (i > 0)
                     92:                {
                     93:                        /* turn into nonfatal error */
                     94:                        ppb->pb_stat |= PB_INFO;
                     95:                        ppb->pb_proc = PB_FRONT;
                     96:                }
                     97:                else
                     98:                {
                     99:                        /* call the cleanup function */
                    100:                        if (f != NULL && f->fn_active > 0)
                    101:                                (*f->fn_cleanup)(1);
                    102:                }
                    103: 
                    104:                /* arrange to leave if parent not in this process */
                    105:                if (ppb->pb_proc != Cm.cm_myproc)
                    106:                {
                    107:                        send_off(ppb, pc, pv);
                    108:                        pb_flush(ppb);
                    109: 
                    110:                        /* throw away dead contexts and exit */
                    111:                        break;
                    112:                }
                    113:        }
                    114:        if (ctx == NULL)
                    115:                syserr("proc_err: no parent");
                    116: 
                    117: # ifdef xCTR3
                    118:        if (tTf(6, 12))
                    119:        {
                    120:                lprintf("proc_err: cleanup: ctx=%x, ->_link=%x, MonPpb = ", ctx, ctx->ctx_link);
                    121:                pb_dump(MonPpb, TRUE);
                    122:        }
                    123: # endif
                    124:        /* pop contexts down to ctx and exit */
                    125:        ctx = ctx->ctx_link;
                    126:        while (Ctx.ctx_link != ctx)
                    127:        {
                    128:                if (Ctx.ctx_link == NULL)
                    129:                        syserr("proc_err: underflow");
                    130:                Ctx.ctx_new = TRUE;
                    131:                resetp();
                    132:        }
                    133: 
                    134:        /*
                    135:        **  Flush input pipe.
                    136:        **      THIS CODE IS ONLY NEEDED TO MAKE READMON WORK, AND
                    137:        **      SHOULD BE REMOVED WHEN READMON GOES AWAY!!
                    138:        */
                    139: 
                    140:        if (ctx == NULL)
                    141:        {
                    142:                Cm.cm_input = Cm.cm_rinput;
                    143:                while (!bitset(PB_EOF, MonPpb->pb_stat))
                    144:                        pb_read(MonPpb);
                    145:                MonPpb->pb_st = PB_UNKNOWN;
                    146:        }
                    147: 
                    148:        longjmp(Ctx.ctx_jbuf, 1);
                    149: }

unix.superglobalmegacorp.com

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