home *** CD-ROM | disk | FTP | other *** search
- #include "../h/param.h"
- #include "../h/systm.h"
- #include "../h/conf.h"
- #include "../h/buf.h"
-
- #define XPRI 30
- #define NBLOCKS 10
-
- int bwaiting, wcount;
- struct buf *bufps[NBLOCKS];
- char *nbase[NBLOCKS]; /* normal allocations */
- short nmap[NBLOCKS]; /* 1 bit == 32 bytes */
-
- char log[] ={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4};
- #define FULL -1
- #define LOCK s = spl6()
- #define UNLOCK splx(s)
-
- /*
- * getepack: get empty packet
- * with size specified by bitmask.
- */
- char *
- getepack(bits)
- {
- register i;
- int s, savbits;
- char **base;
- short *map;
-
- base = nbase; map = nmap;
- savbits = bits;
-
- /*
- * search for space
- */
- LOCK;
- for(;;) {
-
- if (bits == FULL)
- goto force;
-
- for(i=0; i<NBLOCKS; i++) {
- register m;
- register unsigned n;
- register offset;
-
- m = map[i];
- if (m==FULL || base[i]==NULL)
- continue;
- if (bits == 1) {
- n = m;
- m |= m+1;
- n = m-n;
- for (offset=0; n > 16; n >>= 4)
- offset += 4;
- offset += log[n];
- } else {
- bits = savbits;
- for(n=17; --n; bits <<= 1)
- if ((m&bits)==0)
- goto found;
- continue;
- found:
- offset = 16-n;
- m |= bits;
- }
- map[i] = m;
- UNLOCK;
- return(base[i] + 32*offset);
- }
- /*
- * grab another block from the system
- */
- force:
- for(i=0;i<NBLOCKS;i++) {
- register struct buf *bp;
-
- if (bufps[i]!=NULL)
- continue;
- bufps[i] = bp = geteblk();
- bp->b_flags |= B_PACK;
- bp->b_flags |= B_PBUSY;
- map[i] = bits;
- base[i] = bp->b_un.b_addr;
- UNLOCK;
- return(bp->b_un.b_addr);
- }
- /*
- * sleep until something is released
- */
- bwaiting++;
- wcount++;
- sleep((caddr_t)&bwaiting, XPRI);
- bwaiting--;
- }
- }
-
- /*
- * freepack: release space beginning
- * at address p with length specified
- * by bits.
- */
- freepack(p, bits)
- char *p;
- {
- register i, d, s;
- char **base;
- short *map;
-
- if (p==NULL)
- return;
- LOCK;
- base = nbase; map = nmap;
-
- for(i=0;i<NBLOCKS;i++) {
- d = p-base[i];
- if (d>=0 && d<=512)
- goto found;
- }
- goto out;
- found:
- d >>= 5;
- d = (bits<<d);
- map[i] &= ~d;
- if (map[i]==0) {
- register struct buf *bp;
-
- bp = bufps[i];
- bp->b_flags &= ~B_PBUSY;
- base[i] = NULL;
- bufps[i] = NULL;
- brelse(bp);
- }
- if (bwaiting)
- wakeup((caddr_t)&bwaiting);
- out:
- splx(s);
- }
-
-
-
- /*
- * integer to bitmap conversion
- */
- dtom(d)
- register d;
- {
- register m;
-
- m = 1;
- while (d>32) {
- d -= 32;
- m |= m+1;
- }
- return(m);
- }
-
- #define NRECS 160
- int reclist[NRECS];
- int recbits[NRECS];
-
-