Annotation of 43BSD/ingres/source/iutil/add_ovflo.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <access.h>
                      3: # include      <aux.h>
                      4: # include      <lock.h>
                      5: # include      <sccs.h>
                      6: 
                      7: SCCSID(@(#)add_ovflo.c 8.2     2/8/85)
                      8: 
                      9: /*
                     10: **     ADD_OVFLO -- Allocates an overflow page which will be
                     11: **             attached to current page.  TID must be for current page.
                     12: **             TID will be updated to id of new overflow page.
                     13: **
                     14: **     Parameters:
                     15: **             dx - descriptor for relation
                     16: **             tid - tid for current page
                     17: **
                     18: **     Side Effects:
                     19: **             tid is updated to id of new overflow page
                     20: **
                     21: **     Trace Flags:
                     22: **             26.3
                     23: **
                     24: **     Returns:
                     25: **             0 - success
                     26: **             -1 (NOBUFFER) can't get buffer for overflow page
                     27: **             -2 (NOSETUP) can't set up overflow page
                     28: **             -3 (NOGETCURRENT) can't get the current page
                     29: **             -4 (NORMVMAIN) can't remove main page
                     30: **             -5 (NOGETOVFLO) can't get the overflow page
                     31: **
                     32: */
                     33: 
                     34: add_ovflo(dx, tid)
                     35: DESC   *dx;
                     36: TID    *tid;
                     37: {
                     38:        register DESC           *d;
                     39:        register struct accbuf  *b;
                     40:        extern struct accbuf    *choose_buf();
                     41:        register int            lk;
                     42:        int                     i;
                     43:        long                    mpage, newpage;
                     44:        TID                     tidx;
                     45: 
                     46:        d = dx;
                     47: #      ifdef xATR2
                     48:        if (tTf(26, 3))
                     49:                printf("ADD_OVFLO:\n");
                     50: #      endif
                     51: 
                     52:        /*
                     53:        **      save main page pointer so that it may be used when
                     54:        **      setting up new overflow page.
                     55:        */
                     56:        mpage = Acc_head->mainpg;
                     57: 
                     58:        if (lk = (Acclock && (d->reldum.relstat & S_CONCUR) && (d->relopn < 0 )))
                     59:        {
                     60:                setcsl(Acc_head->rel_tupid);
                     61:                Acclock = FALSE;
                     62:        }
                     63: 
                     64:        /*
                     65:        **      Determine last page of the relation
                     66:        */
                     67:        last_page(d, &tidx, Acc_head);
                     68:        pluck_page(&tidx, &newpage);
                     69:        newpage++;
                     70: 
                     71:        /*
                     72:        **      choose an available buffer as victim for setting up
                     73:        **      overflow page.
                     74:        */
                     75:        if ((b = choose_buf(d, newpage)) == NULL)
                     76:        {
                     77:                if (lk)
                     78:                {
                     79:                        Acclock = TRUE;
                     80:                        unlcs(Acc_head->rel_tupid);
                     81:                }
                     82:                return(NOBUFFER);
                     83:        }
                     84: 
                     85:        /*
                     86:        **      setup overflow page
                     87:        */
                     88: 
                     89:        b->mainpg = mpage;
                     90:        b->ovflopg = 0;
                     91:        b->thispage = newpage;
                     92:        b->linetab[0] = (int) b->firstup - (int) b;
                     93:        b->nxtlino = 0;
                     94:        b->bufstatus |= BUF_DIRTY;
                     95:        if (pageflush(b))
                     96:                return (NOSETUP);
                     97: 
                     98:        /*
                     99:        **      now that overflow page has successfully been written,
                    100:        **      get the old current page back and link the new overflow page
                    101:        **      to it.
                    102:        **      If the relation is a heap then don't leave the old main
                    103:        **      page around in the buffers. This is done on the belief
                    104:        **      that it will never be accessed again.
                    105:        */
                    106: 
                    107:        if (get_page(d, tid))
                    108:                return (NOGETCURRENT);
                    109:        Acc_head->ovflopg = newpage;
                    110:        Acc_head->bufstatus |= BUF_DIRTY;
                    111:        i = pageflush(Acc_head);
                    112:        if (lk)
                    113:        {
                    114:                Acclock = TRUE;
                    115:                unlcs(Acc_head->rel_tupid);
                    116:        }
                    117:        if (i)
                    118:                return (NORMVMAIN);
                    119:        if (abs(d->reldum.relspec) == M_HEAP)
                    120:                resetacc(Acc_head);     /* no error is possible */
                    121: 
                    122:        /*
                    123:        **      now bring the overflow page back and make it current.
                    124:        **      if the overflow page is still in AM cache, then this will not
                    125:        **      cause any disk activity.
                    126:        */
                    127: 
                    128:        stuff_page(tid, &newpage);
                    129:        if (get_page(d, tid))
                    130:                return (NOGETOVFLO);
                    131:        return (0);
                    132: }

unix.superglobalmegacorp.com

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