URI: 
       tpool - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tpool (4898B)
       ---
            1 include("/sys/src/libc/port/pool.acid");
            2 
            3 aggr Byte {
            4         'b' 0 byte;
            5 };
            6 
            7 defn
            8 byteat(addr)
            9 {
           10         local x;
           11         complex Byte addr;
           12         x = addr.byte;
           13         return x\d;
           14 }
           15 
           16 defn
           17 B2T(addr) {
           18         complex Bhdr addr;
           19         addr = addr+addr.size-sizeofBtail;
           20         complex Btail addr;
           21         return addr;
           22 }
           23 
           24 defn
           25 B2D(addr) {
           26         local x;
           27         x = addr+sizeofBhdr;
           28         return x\X;
           29 }
           30 
           31 defn
           32 D2B(addr) {
           33         local x;
           34         x = addr-sizeofBhdr;
           35         complex Bhdr x;
           36         return x;
           37 }
           38 
           39 defn
           40 B2NB(addr) {
           41         complex Bhdr addr;
           42         addr = addr+addr.size;
           43         complex Bhdr addr;
           44         return addr;
           45 }
           46 
           47 defn
           48 A2TB(addr) {
           49         local b;
           50         complex Arena addr;
           51         b = addr+addr.asize-sizeofBhdr;
           52         complex Bhdr b;
           53         return b;
           54 }
           55 
           56 defn
           57 A2B(addr) {
           58         return B2NB(addr);
           59 }
           60 
           61 defn
           62 B2PT(addr) {
           63         complex Bhdr addr;
           64         addr = addr-sizeofBtail;
           65         complex Btail addr;
           66         return addr;
           67 }
           68 
           69 defn
           70 SHORT(addr) {
           71         local hi, lo;
           72 
           73         hi = byteat(addr);
           74         lo = byteat(addr+1);
           75         return lo+hi*256;
           76 }
           77 
           78 defn
           79 Btail(addr) {
           80         complex Btail addr;
           81         print("        magic0        ", addr.magic0, "\n");
           82         print("        datadiff        ", SHORT(addr.datasize), "\n");
           83         print("        magic1        ", addr.magic1, "\n");
           84         print("        size        ", addr.size\X, "\n");
           85         print("        hdr        ", addr+sizeofBtail-addr.size\X, "\n");
           86 };
           87 
           88 defn
           89 Tail(addr)
           90 {
           91         print("        ", B2T(addr)\X, "\n");
           92         Btail(B2T(addr));
           93 }
           94 
           95 defn
           96 Magic(m)
           97 {
           98         if m == FREE_MAGIC then
           99                 return "free";
          100         if m == ARENA_MAGIC then
          101                 return "arena";
          102         if m == UNKEMPT_MAGIC then
          103                 return "unkempt";
          104         if m == KEMPT_MAGIC then
          105                 return "kempt";
          106         if m == ARENATAIL_MAGIC then
          107                 return "arenatail";
          108         if m == DEAD_MAGIC then
          109                 return "dead";
          110         return "unknown magic";
          111 }
          112 
          113 defn
          114 Block(addr)
          115 {
          116         complex Bhdr addr;
          117         print("        ", Magic(addr.magic), "\n");
          118         print("        data ", B2D(addr), "\n");
          119         print("        datasize ", getdsize(addr), "\n");
          120         Bhdr(addr);
          121         Tail(addr);
          122 }
          123 
          124 defn
          125 getdsize(addr)
          126 {
          127         complex Bhdr addr;
          128         local x;
          129 
          130         x = addr.size\d;
          131         x = x-SHORT(B2T(addr).datasize);
          132         return x\d;
          133 }
          134 
          135 defn
          136 datamagic(x)
          137 {
          138         x = x%4;
          139         if x == 0 then return 0xFE;
          140         if x == 1 then return 0xF1;
          141         if x == 2 then return 0xF0;
          142         if x == 3 then return 0xFA;
          143 }
          144 
          145 defn
          146 checkblock(addr)
          147 {
          148         local badmagic, datamagic, a, b, t, q, n, dsize, taddr, checked;
          149         complex Bhdr addr;
          150         taddr = B2T(addr);
          151         complex Btail taddr;
          152 
          153         if addr.magic == FREE_MAGIC || addr.magic == UNKEMPT_MAGIC then {
          154                 if taddr.magic0 != TAIL_MAGIC0 || taddr.magic1 != TAIL_MAGIC1 then
          155                         print(addr\X, " corrupt tail magic\n");
          156                 if taddr.size != addr.size then
          157                         print(addr\X, " corrupt tail header pointer\n");
          158         }
          159 
          160         if addr.magic == ARENA_MAGIC then {
          161                 taddr = A2TB(addr);
          162                 if taddr.magic != ARENATAIL_MAGIC then
          163                         print(addr\X, " arena with bad tail block\n");
          164                 else
          165                         addr = taddr;
          166         }
          167 
          168         if addr.magic == ARENATAIL_MAGIC then {
          169                 if addr.size != 0 then
          170                         print(addr\X, " bad size in arena tail\n");
          171         }
          172 
          173         if addr.magic == KEMPT_MAGIC then {
          174                 a = addr;
          175                 complex Alloc a;
          176                 if a.size > 1024*1024*1024 then 
          177                         print(addr\X, " block ridiculously large\n");
          178                 t = B2T(addr);
          179                 if t.magic0 != TAIL_MAGIC0 || t.magic1 != TAIL_MAGIC1 then
          180                         print(addr\X, " bad tail magic\n");
          181                 if t.size != addr.size then
          182                         print(addr\X, " bad tail pointer\n");
          183                 dsize = getdsize(a);
          184                 if dsize > a.size then
          185                         print(addr\X, " too much data in block\n");
          186                 q = B2D(a)\X+dsize;
          187                 n = 4;
          188                 if q+4 > t then
          189                         n = t-q;
          190                 badmagic = 0;
          191                 loop 0,n-1 do {
          192                         if byteat(q) != datamagic(q) then {
          193                                 badmagic=1;
          194                         }
          195                         q = q+1;
          196                 }
          197                 if badmagic then
          198                         print(addr\X, " size ", dsize, " user has overwritten boundary\n");
          199         }
          200 }
          201 
          202 defn
          203 checkarena(arena)
          204 {
          205         local atail, b;
          206 
          207         atail = A2TB(arena);
          208         complex Bhdr arena;
          209         b = arena;
          210         while b.magic != ARENATAIL_MAGIC && b < atail do {
          211                 checkblock(b);
          212                 if B2NB(b) == b then {
          213                         print("B2NB(", b\X, ") = b\n");
          214                         b = atail;        // end loop
          215                 }
          216                 b = B2NB(b);
          217         }
          218 
          219         checkblock(b);
          220         if b != atail then
          221                 print("found wrong tail to arena ", arena\X, "\n");
          222 }
          223 
          224 defn
          225 checkpool(p)
          226 {
          227         complex Pool p;
          228         local a;
          229         a = p.arenalist;
          230 
          231         while a != 0 do {
          232                 complex Arena a;
          233                 checkarena(a);
          234                 a = a.down;
          235         }
          236 }
          237 
          238 defn
          239 gendumptree(f, in, s)
          240 {
          241         complex Free f;
          242 
          243         loop 1,in do {print(" ");}
          244         print(s, " size ", f.size\D, " left ", f.left\X, " right ", f.right\X, "\n");
          245         if f.left != 0 && f.left < 0x7FFFFFFF then
          246                 gendumptree(f.left, in+1, "l");
          247         if f.right != 0 && f.right < 0x7FFFFFFF then
          248                 gendumptree(f.right, in+1, "r");
          249 }
          250 
          251 defn
          252 dumptree(f)
          253 {
          254         gendumptree(f, 0, "*");
          255 }
          256 
          257 defn
          258 poolwhopointsat(p, addr)
          259 {
          260         complex Pool p;
          261         local a;
          262 
          263         a = p.arenalist;
          264         while a != 0 do {
          265                 complex Arena a;
          266                 arenawhopointsat(a, addr);
          267                 a = a.down;
          268         }
          269 }
          270 
          271 defn 
          272 arenawhopointsat(arena, addr)
          273 {
          274         local atail, b;
          275 
          276         atail = A2TB(arena);
          277         complex Bhdr arena;
          278         b = arena;
          279         while b < atail do {
          280                 if *b == addr then 
          281                         print(b\X, "\n");
          282                 b = b+4;
          283         }
          284 }
          285 
          286 defn
          287 whopointsat(addr)
          288 {
          289         poolwhopointsat(*mainmem, addr);
          290 }
          291 
          292 defn
          293 blockhdr(addr)
          294 {
          295         addr = addr & ~3;
          296 
          297         while *addr != FREE_MAGIC 
          298                 && *addr !=  ARENA_MAGIC
          299                 && *addr != UNKEMPT_MAGIC
          300                 && *addr != KEMPT_MAGIC
          301                 && *addr != ARENATAIL_MAGIC
          302         do
          303                 addr = addr-4;
          304         return addr;
          305 }
          306