/* Simple check whether memalign tends to waste some space. */ #include #include #include int main (int argc, char *argv[]) { int i, j, bad = 0; const size_t blksz = 1024, padsz = 8; void *p, *prev; /* make some chaos in the heap */ for (i = 0; i <= 1000; i++) for (j = 8; j <= 1024; j += 8) { p = malloc (j); if (((i + j) & 7) == 0) free (p); } /* test asks for BLKSZ - PADSZ bytes aligned at BLKSZ boundary */ for (i = 0, prev = NULL; i < 16; i++) { p = memalign (blksz, blksz - padsz); if (!p) bad++; else if (prev && p - prev > blksz) bad++; prev = p; } /* make even more chaos with larger chunks */ for (i = 0; i <= 1000; i++) for (j = 8; j <= 1024; j += 8) { p = malloc (j * 16); if (((i + j) & 15) == 0) free (p); } /* test again */ for (i = 0, prev = NULL; i < 16; i++) { p = memalign (blksz, blksz - padsz); if (!p) bad++; else if (prev && p - prev > blksz) bad++; prev = p; } /* zero means memalign looks good enough */ return bad; }