|
|
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(@(#)page.c 8.3 2/8/85) ! 8: ! 9: /* ! 10: ** UNIX read/write counters ! 11: */ ! 12: ! 13: long Accuread, Accuwrite; ! 14: long Accusread; ! 15: ! 16: /* ! 17: ** GETPAGE - get the page on which tid is found ! 18: ** ! 19: ** ! 20: ** Parameters: ! 21: ** d - descriptor for relation ! 22: ** tid - tid which specifies the page ! 23: ** ! 24: ** Return Codes: ! 25: ** 0 - success ! 26: ** -1, -2 - AMREAD_ERR, AMWRITE_ERR ! 27: ** ! 28: ** Trace Flags: ! 29: ** 26.9, 26.10 ! 30: ** ! 31: ** Called by: ! 32: ** fill_rel(), add_ovflo(), bndxsearch(), delete(), ! 33: ** get(), getequal(), ndxsearch(), noclose(), replace() ! 34: ** scan_dups() ! 35: ** ! 36: */ ! 37: get_page(d, tid) ! 38: register DESC *d; ! 39: TID *tid; ! 40: { ! 41: register int i; ! 42: long pageid; ! 43: register struct accbuf *b; ! 44: struct accbuf *b1; ! 45: int lk; /* lock condition*/ ! 46: extern struct accbuf *choose_buf(); ! 47: extern long lseek(); ! 48: ! 49: # ifdef xATR3 ! 50: if (tTf(26, 9)) ! 51: { ! 52: printf("GET_PAGE: %.14s,", d->reldum.relid); ! 53: dumptid(tid); ! 54: } ! 55: # endif ! 56: ! 57: pluck_page(tid, &pageid); ! 58: if ((b = choose_buf(d, pageid)) == NULL) ! 59: return (-1); ! 60: top_acc(b); ! 61: lk = Acclock && (d->reldum.relstat & S_CONCUR) && (d->relopn < 0); ! 62: if ((b->thispage != pageid) || (lk && !(b->bufstatus & BUF_LOCKED))) ! 63: { ! 64: if (i = pageflush(b)) ! 65: return (i); ! 66: # ifdef xATR1 ! 67: if (tTf(26, 10)) ! 68: { ! 69: printf("GET_PAGE: rdg pg %ld", pageid); ! 70: printf(",relid "); ! 71: dumptid((TID *) &d->reltid); ! 72: } ! 73: # endif ! 74: b->thispage = pageid; ! 75: if (lk) ! 76: { ! 77: b1 = Acc_head; ! 78: for (; b1 != 0; b1 = b1->modf) ! 79: if (b1->bufstatus & BUF_LOCKED) ! 80: pageflush(b1); /* */ ! 81: if (setpgl(b) < 0) ! 82: syserr("get-page: lk err"); ! 83: } ! 84: if ((lseek(d->relfp, (long)(pageid * PGSIZE), 0) == -1) || ! 85: (read(d->relfp, (char *) b, PGSIZE) != PGSIZE)) ! 86: { ! 87: resetacc(b); ! 88: return (acc_err(AMREAD_ERR)); ! 89: } ! 90: Accuread++; ! 91: if (d->reldum.relstat & S_CATALOG) ! 92: { ! 93: Accusread++; ! 94: } ! 95: } ! 96: return (0); ! 97: } ! 98: ! 99: /* ! 100: ** PAGEFLUSH - flush the buffered page to disk ! 101: ** ! 102: ** Parameters: ! 103: ** buf - the buffer ! 104: ** ! 105: ** Return Codes: ! 106: ** 0 -- successful ! 107: ** AMWRITE_ERR - error in writing ! 108: ** ! 109: ** Trace Flags: ! 110: ** 29.2, 29.3 ! 111: ** ! 112: */ ! 113: pageflush(buf) ! 114: struct accbuf *buf; ! 115: { ! 116: register struct accbuf *b; ! 117: register int allbufs; ! 118: int err; ! 119: ! 120: b = buf; ! 121: # ifdef xATR3 ! 122: if (tTf(29, 2)) ! 123: { ! 124: printf("PAGEFLUSH: %x=", b); ! 125: if (b != NULL) ! 126: dumptid(&b->rel_tupid); ! 127: else ! 128: printf("all\n"); ! 129: } ! 130: # endif ! 131: err = FALSE; ! 132: allbufs = FALSE; ! 133: if (b == 0) ! 134: { ! 135: b = Acc_buf; ! 136: allbufs = TRUE; ! 137: } ! 138: ! 139: do ! 140: { ! 141: if (b->bufstatus & BUF_DIRTY) ! 142: { ! 143: # ifdef xATR1 ! 144: if (tTf(29, 3)) ! 145: { ! 146: printf("PAGEFLUSH: wr pg %ld", b->thispage); ! 147: printf(",stat %d,relid ", b->bufstatus); ! 148: dumptid((TID *) &b->rel_tupid); ! 149: } ! 150: # endif ! 151: ! 152: ! 153: b->bufstatus &= ~BUF_DIRTY; ! 154: if ((lseek(b->filedesc, (long)(b->thispage * PGSIZE), 0)== -1) || ! 155: (write(b->filedesc, (char *) b, PGSIZE) != PGSIZE)) ! 156: { ! 157: resetacc(b); ! 158: err = TRUE; ! 159: } ! 160: Accuwrite++; ! 161: ! 162: } ! 163: if (Acclock && b->bufstatus & BUF_LOCKED) ! 164: unlpg(b); ! 165: ! 166: } while (allbufs && (b = b->modf) != NULL); ! 167: ! 168: if (err) ! 169: return (acc_err(AMWRITE_ERR)); ! 170: ! 171: return (0); ! 172: } ! 173: /* ! 174: ** ACC_ERR -- set global error indicator "Accerror" ! 175: ** ! 176: ** Trace Flags: ! 177: ** 20.4-5 ! 178: */ ! 179: ! 180: acc_err(errnum) ! 181: int errnum; ! 182: { ! 183: Accerror = errnum; ! 184: # ifdef xATR1 ! 185: tTfp(20, 4, "ACC_ERR: %d\n", Accerror); ! 186: # endif ! 187: return (Accerror); ! 188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.