improve acidleak performance and reduce memory usage by doubling block and data allocations when necessary, instead of allocating 64 at a time. this decreases memory used ~50% and runtime by about 90% when using leak(1) on programs that allocation many small blocks, such as older versions of upas/fs. Reference: /n/sources/patch/applied/acidleak Date: Sat Aug 8 21:33:02 CES 2009 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/aux/acidleak.c Sat Aug 8 21:28:38 2009 +++ /sys/src/cmd/aux/acidleak.c Sat Aug 8 21:28:36 2009 @@ -56,11 +56,13 @@ }; Block *block; -int nblock; +uint nblock; +uint ablock; Data *data; Data *edata; -int ndata; +uint ndata; +uint adata; int addrcmp(void *va, void *vb) @@ -200,8 +202,11 @@ p[Blinelen(&bio)-1] = '\0'; nf = tokenize(p, f, nelem(f)); if(nf >= 4 && strcmp(f[0], "data") == 0) { - if(ndata%64==0) - data = erealloc(data, (ndata+64)*sizeof(Data)); + if(ndata == adata){ + if(adata == 0) + adata = 4096; + data = erealloc(data, (adata <<= 1)*sizeof(Data)); + } data[ndata].addr = strtoul(f[1], nil, 0); data[ndata].val = strtoul(f[2], nil, 0); data[ndata].type = f[3][0]; @@ -209,8 +214,11 @@ ndata++; } if(nf >= 5 && (strcmp(f[0], "block") == 0 || strcmp(f[0], "free") == 0)) { - if(nblock%64 == 0) - block = erealloc(block, (nblock+64)*sizeof(Block)); + if(nblock == ablock){ + if(ablock == 0) + ablock = 4096; + block = erealloc(block, (ablock <<= 1)*sizeof(Block)); + } block[nblock].addr = strtoul(f[1], nil, 0); block[nblock].size = strtoul(f[2], nil, 0); block[nblock].w0 = strtoul(f[3], nil, 0); @@ -319,4 +327,5 @@ Bprint(&bio, "block 0x%.8lux 0x%.8lux 0x%.8lux 0x%.8lux %s %s\n", b->addr, b->size, b->w0, b->w1, b->s0, b->s1); } Bterm(&bio); + exits(""); }