#include #include #include #include #include struct meta { struct meta *prev, *next; struct group *mem; volatile int avail_mask, freed_mask; uintptr_t last_idx:5; uintptr_t freeable:1; uintptr_t sizeclass:6; uintptr_t maplen:8*sizeof(uintptr_t)-12; }; const uint16_t size_classes[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 18, 20, 25, 31, 36, 42, 50, 63, 72, 84, 102, 127, 146, 170, 204, 255, 292, 340, 409, 511, 584, 682, 818, 1023, 1169, 1364, 1637, 2047, 2340, 2730, 3276, 4095, 4680, 5460, 6552, 8191, }; void runtest(size_t size) { pid_t pid; if ((pid=fork())) { waitpid(pid, 0, 0); return; } unsigned char *p, *ptrs[200]; printf("%5zu: ", size); for (int i=0; imaplen || m->maplen*4096UL>=size_classes[m->sizeclass]*16+16) printf(" %2dx%-5d", m->last_idx+1, size_classes[m->sizeclass]*16); else printf(" %7luk", m->maplen*4UL); } else { //printf("[ ]"); } } for (int i=0; i