Annotation of 43BSD/ingres/source/ctlmod/call_fn.c, revision 1.1.1.1

1.1       root        1: # include      "ctlmod.h"
                      2: # include      <resp.h>
                      3: # include      <sccs.h>
                      4: 
                      5: SCCSID(@(#)call_fn.c   8.1     12/31/84)
                      6: 
                      7: /*
                      8: **  CALL_FN -- call a local function
                      9: **
                     10: **     This routine, given a pointer to a local function descriptor,
                     11: **     calls the local function.
                     12: **
                     13: **     Parameters:
                     14: **             fno -- function definition vector number.
                     15: **             pc -- the parameter count
                     16: **             pv -- the parameter vector, gets passed to the
                     17: **                     function.
                     18: **
                     19: **     Returns:
                     20: **             none
                     21: **
                     22: **     Side Effects:
                     23: **             Sets 'Resp' to the response vector for this function.
                     24: **             The old 'Resp' is completely obliterated.
                     25: **
                     26: **     Trace Flags:
                     27: **             3
                     28: */
                     29: 
                     30: # ifdef xMONITOR
                     31: struct monitor MonBuf[CM_MAXST];
                     32: # endif xMONITOR
                     33: 
                     34: call_fn(fno, pc, pv)
                     35: int    fno;
                     36: int    pc;
                     37: PARM   **pv;
                     38: {
                     39:        register struct fn_def  *f;
                     40:        register char           *gp;
                     41:        register int            i;
                     42: # ifdef xMONITOR
                     43:        extern struct monitor   CmMonBuf;
                     44:        struct monitor          mon;
                     45:        struct monitor          *savemon;
                     46:        extern char             *cvt_time();
                     47: # endif
                     48:        extern char             *Proc_name;
                     49:        short                   *tvect;
                     50:        char                    *oldname;
                     51:        extern short            *tT;
                     52:        extern char             *malloc();
                     53: 
                     54:        f = FuncVect[fno];
                     55:        if (fno > NumFunc || f->fn_fn == NULL || fno < 0)
                     56:                syserr("call_fn: undef fn %d", fno);
                     57:        Ctx.ctx_fn = f;
                     58: # ifdef xCTR1
                     59:        if (tTf(3, 0))
                     60:                lprintf("call_fn: fn %d (%s)\n", fno, f->fn_name);
                     61: # endif
                     62: 
                     63:        /*
                     64:        **  Save function globals.
                     65:        **      If the function we want to call is already active,
                     66:        **      and if it has a global data area, allocate space
                     67:        **      and save that area.
                     68:        */
                     69: 
                     70:        if (f->fn_active > 0 && f->fn_gptr != NULL)
                     71:        {
                     72:                /* save globals */
                     73:                gp = malloc(f->fn_gsize);
                     74:                bmove(f->fn_gptr, gp, f->fn_gsize);
                     75:                Ctx.ctx_glob = gp;
                     76:        }
                     77:        else
                     78:                Ctx.ctx_glob = gp = NULL;
                     79: 
                     80:        /*
                     81:        **  Clear the response vector to a known state and call
                     82:        **  the function.
                     83:        */
                     84: 
                     85:        oldname = Proc_name;
                     86:        Ctx.ctx_name = Proc_name = f->fn_name;
                     87:        tvect = tT;
                     88:        Ctx.ctx_tvect = tT = f->fn_tvect;
                     89:        clrmem(&Resp, sizeof Resp);
                     90:        Resp.resp_tups = -1;
                     91:        markopen(&Ctx.ctx_ofiles);
                     92: # ifdef xCTR2
                     93:        if (tTf(3, 1))
                     94:        {
                     95:                lprintf("call_fn: calling %s\n", Proc_name);
                     96:                prvect(pc, pv);
                     97:        }
                     98: # endif
                     99: # ifdef xCTR3
                    100:        if (tTf(3, 2))
                    101:        {
                    102:                lprintf("call_fn: Ctx.ctx_ppb ");
                    103:                pb_dump(Ctx.ctx_ppb, FALSE);
                    104:        }
                    105: # endif xCTR3
                    106: # ifdef xMONITOR
                    107:        savemon = Ctx.ctx_mon;
                    108:        Ctx.ctx_mon = &mon;
                    109:        clrmem(&mon, sizeof mon);
                    110:        markperf(&mon);
                    111: # endif xMONITOR
                    112: 
                    113:        i = (*f->fn_fn)(pc, pv);
                    114: 
                    115: # ifdef xMONITOR
                    116:        markperf(&CmMonBuf);
                    117:        Ctx.ctx_mon = savemon;
                    118:        if (savemon != NULL)
                    119:                add_mon(&mon, savemon);
                    120:        add_mon(&mon, &MonBuf[Ctx.ctx_ppb->pb_st]);
                    121: # endif xMONITOR
                    122: # ifdef xCTR1
                    123:        if (tTf(3, 3))
                    124:                lprintf("call_fn: returns %d\n", i);
                    125: # endif
                    126: # ifdef xMONITOR
                    127:        if (tTf(0, 0))
                    128:                printf("CPU time for %s = %s sec\n", Proc_name,
                    129:                       cvt_time(mon.mon_utime + mon.mon_stime));
                    130: # endif xMONITOR
                    131:        Resp.resp_resp = i;
                    132:        closeall(TRUE, Ctx.ctx_ofiles);
                    133: 
                    134:        /*
                    135:        **  Restore old global memory, if there was any.
                    136:        */
                    137: 
                    138:        if (gp != NULL)
                    139:        {
                    140:                bmove(gp, f->fn_gptr, f->fn_gsize);
                    141:                Ctx.ctx_glob = NULL;
                    142:                free(gp);
                    143:        }
                    144:        Ctx.ctx_name = Proc_name = oldname;
                    145:        Ctx.ctx_tvect = tT = tvect;
                    146: }

unix.superglobalmegacorp.com

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