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