1: #include "../h/param.h"
   2: #include "../h/systm.h"
   3: #include "../h/conf.h"
   4: #include "../h/buf.h"
   5: 
   6: #define XPRI    30
   7: #define NBLOCKS 10
   8: 
   9: int bwaiting, wcount;
  10: struct  buf *bufps[NBLOCKS];
  11: char    *nbase[NBLOCKS];    /* normal allocations */
  12: short   nmap[NBLOCKS];      /* 1 bit == 32 bytes */
  13: 
  14: char log[] ={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4};
  15: #define FULL    -1
  16: #define LOCK    s = spl6()
  17: #define UNLOCK  splx(s)
  18: 
  19: /*
  20:  * getepack: get empty packet
  21:  * with size specified by bitmask.
  22:  */
  23: char *
  24: getepack(bits)
  25: {
  26: register i;
  27: int s, savbits;
  28: char    **base;
  29: short   *map;
  30: 
  31:     base = nbase; map = nmap;
  32:     savbits = bits;
  33: 
  34:     /*
  35: 	 * search for space
  36: 	 */
  37:     LOCK;
  38:     for(;;) {
  39: 
  40:         if (bits == FULL)
  41:             goto force;
  42: 
  43:         for(i=0; i<NBLOCKS; i++) {
  44:             register m;
  45:             register unsigned n;
  46:             register offset;
  47: 
  48:             m = map[i];
  49:             if (m==FULL || base[i]==NULL)
  50:                 continue;
  51:             if (bits == 1) {
  52:                 n = m;
  53:                 m |= m+1;
  54:                 n = m-n;
  55:                 for (offset=0; n > 16; n >>= 4)
  56:                     offset += 4;
  57:                 offset += log[n];
  58:             } else {
  59:                 bits = savbits;
  60:                 for(n=17; --n; bits <<= 1)
  61:                     if ((m&bits)==0)
  62:                         goto found;
  63:                 continue;
  64:             found:
  65:                 offset = 16-n;
  66:                 m |= bits;
  67:             }
  68:             map[i] = m;
  69:             UNLOCK;
  70:             return(base[i] + 32*offset);
  71:         }
  72:         /*
  73: 		 * grab another block from the system
  74: 		 */
  75:     force:
  76:         for(i=0;i<NBLOCKS;i++) {
  77:             register struct buf *bp;
  78: 
  79:             if (bufps[i]!=NULL)
  80:                 continue;
  81:             bufps[i] = bp = geteblk();
  82:             bp->b_flags |= B_PACK;
  83:             bp->b_flags |= B_PBUSY;
  84:             map[i] = bits;
  85:             base[i] = bp->b_un.b_addr;
  86:             UNLOCK;
  87:             return(bp->b_un.b_addr);
  88:         }
  89:         /*
  90: 		 * sleep until something is released
  91: 		 */
  92:         bwaiting++;
  93:         wcount++;
  94:         sleep((caddr_t)&bwaiting, XPRI);
  95:         bwaiting--;
  96:     }
  97: }
  98: 
  99: /*
 100:  * freepack: release space beginning
 101:  * at address p with length specified
 102:  * by bits.
 103:  */
 104: freepack(p, bits)
 105: char *p;
 106: {
 107: register i, d, s;
 108: char    **base;
 109: short   *map;
 110: 
 111:     if (p==NULL)
 112:         return;
 113:     LOCK;
 114:     base = nbase; map = nmap;
 115: 
 116:     for(i=0;i<NBLOCKS;i++) {
 117:         d = p-base[i];
 118:         if (d>=0 && d<=512)
 119:             goto found;
 120:     }
 121:     goto out;
 122: found:
 123:     d >>= 5;
 124:     d = (bits<<d);
 125:     map[i] &= ~d;
 126:     if (map[i]==0) {
 127:         register struct buf *bp;
 128: 
 129:         bp = bufps[i];
 130:         bp->b_flags &= ~B_PBUSY;
 131:         base[i] = NULL;
 132:         bufps[i] = NULL;
 133:         brelse(bp);
 134:     }
 135:     if (bwaiting)
 136:         wakeup((caddr_t)&bwaiting);
 137: out:
 138:     splx(s);
 139: }
 140: 
 141: 
 142: 
 143: /*
 144:  * integer to bitmap conversion
 145:  */
 146: dtom(d)
 147: register d;
 148: {
 149: register m;
 150: 
 151:     m = 1;
 152:     while (d>32) {
 153:         d -= 32;
 154:         m |= m+1;
 155:     }
 156:     return(m);
 157: }
 158: 
 159: #define NRECS   160
 160: int reclist[NRECS];
 161: int recbits[NRECS];

Defined functions

dtom defined in line 146; used 3 times
freepack defined in line 104; used 1 times
getepack defined in line 23; used 5 times

Defined variables

bufps defined in line 10; used 4 times
bwaiting defined in line 9; used 5 times
log defined in line 14; used 1 times
  • in line 57
nbase defined in line 11; used 2 times
nmap defined in line 12; used 2 times
recbits defined in line 161; never used
reclist defined in line 160; never used
wcount defined in line 9; used 1 times
  • in line 93

Defined macros

FULL defined in line 15; used 2 times
LOCK defined in line 16; used 2 times
NBLOCKS defined in line 7; used 6 times
NRECS defined in line 159; used 2 times
UNLOCK defined in line 17; used 2 times
XPRI defined in line 6; used 1 times
  • in line 94
Last modified: 1979-05-13
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 759
Valid CSS Valid XHTML 1.0 Strict