Annotation of researchv10no/cmd/btree/gbt/bufs.c, revision 1.1

1.1     ! root        1: #include "cbt.h"
        !             2: 
        !             3: typedef struct bhd {
        !             4:        struct bhd *next;
        !             5:        short fd;
        !             6:        long which;
        !             7:        char *where;
        !             8: } bhd;
        !             9: 
        !            10: enum {Nhash = 601, Max = 1000};
        !            11: bhd *bhds[Nhash], *bhfree;
        !            12: bhd bhpool[Max];
        !            13: int btptr;
        !            14: #define hash(a, b) ((b << 8) | a) % Nhash
        !            15: 
        !            16: btbufinit()
        !            17: {      int i;
        !            18:        char *p;
        !            19:        p = (char *) malloc(Max * NDSZ);
        !            20:        if(!p)
        !            21:                abort();
        !            22:        for(i = 1; i < Max; i++) {
        !            23:                bhpool[i-1].next = bhpool + i;
        !            24:                bhpool[i].where = p + NDSZ * i;
        !            25:        }
        !            26:        bhpool[0].where = p;
        !            27:        bhfree = bhpool + 0;
        !            28: }
        !            29: 
        !            30: btbufdone(fd)
        !            31: {      int i;
        !            32:        bhd *p, *q;
        !            33:        for(i = 0; i < Nhash; i++) {
        !            34:                p = bhds[i];
        !            35: loop:
        !            36:                if(!p)
        !            37:                        continue;
        !            38:                if(p->fd != fd) {
        !            39:                        p = p->next;
        !            40:                        goto loop;
        !            41:                }
        !            42:                lseek(p->fd, p->which*NDSZ, 0);
        !            43:                write(p->fd, p->where, NDSZ);   /* check these dammit */
        !            44:                q = p;
        !            45:                p = p->next;
        !            46:                q->next = bhfree;
        !            47:                goto loop;
        !            48:        }
        !            49: }
        !            50: 
        !            51: btbufwrt(fd, which, from)
        !            52: char *from;
        !            53: {      int n;
        !            54:        bhd *p;
        !            55:        n = hash(fd, which);
        !            56:        for(p = bhds[n]; p; p = p->next)
        !            57:                if(p->fd == fd && p->which == which) {
        !            58:                        btbcpy(p->where, from, NDSZ);
        !            59:                        return;
        !            60:                }
        !            61:        if(!bhfree)
        !            62:                btbuffree();
        !            63:        p = bhfree;
        !            64:        bhfree = p->next;
        !            65:        p->next = bhds[n];
        !            66:        bhds[n] = p;
        !            67:        p->fd = fd;
        !            68:        p->which = which;
        !            69:        btbcpy(p->where, from, NDSZ);
        !            70: }
        !            71: 
        !            72: btbuffree()
        !            73: {      bhd *p;
        !            74: loop:
        !            75:        if(btptr >= Max)
        !            76:                btptr = 0;
        !            77:        p = bhpool + btptr++;
        !            78:        if(!p->next)
        !            79:                goto loop;
        !            80:        bhfree = p->next;
        !            81:        p->next = bhfree->next;
        !            82:        bhfree->next = 0;
        !            83:        lseek(bhfree->fd, bhfree->which*NDSZ, 0);
        !            84:        write(bhfree->fd, bhfree->where, NDSZ); /* check this dammit */
        !            85: }
        !            86: 
        !            87: btbufread(fd, which, to)
        !            88: char *to;
        !            89: {      int n;
        !            90:        bhd *p;
        !            91:        static init;
        !            92:        if(!init++)
        !            93:                btbufinit();
        !            94:        n = hash(fd, which);
        !            95:        for(p = bhds[n]; p; p = p->next)
        !            96:                if(p->fd == fd && p->which == which) {
        !            97:                        btbcpy(to, p->where, NDSZ);
        !            98:                        return(0);
        !            99:                }
        !           100:        
        !           101:        if(!bhfree)
        !           102:                btbuffree();
        !           103:        p = bhfree;
        !           104:        bhfree = p->next;
        !           105:        p->next = bhds[n];
        !           106:        bhds[n] = p;
        !           107:        p->fd = fd;
        !           108:        p->which = which;
        !           109:        if(lseek(fd, which * NDSZ, 0) == -1)
        !           110:                return(EOF);
        !           111:        if(read(fd, p->where, NDSZ) != NDSZ)
        !           112:                return(EOF);
        !           113:        btbcpy(to, p->where, NDSZ);
        !           114:        return(0);
        !           115: }
        !           116: 
        !           117: btbcpy(to, from, sz)
        !           118: register int *to, *from, sz;
        !           119: {      register int cnt = sz/sizeof(int);
        !           120:        while(cnt-- > 0)
        !           121:                *to++ = *from++;
        !           122: }

unix.superglobalmegacorp.com

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