X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Falloc%2Ftest%2Frun-testsize.c;h=5ad8d2311983fc32250762a5ac162748dc8ff507;hp=2f0b772a4a3ba2a6c3f379b7b55581a51c810f63;hb=7f9d956574d30f70d2260f4b7694f481e3765173;hpb=d707abbb2ff707dd34aa77c9028f23f2266f8d5f diff --git a/ccan/alloc/test/run-testsize.c b/ccan/alloc/test/run-testsize.c index 2f0b772a..5ad8d231 100644 --- a/ccan/alloc/test/run-testsize.c +++ b/ccan/alloc/test/run-testsize.c @@ -1,13 +1,12 @@ #include #include #include +#include +#include #include #include #include -#define POOL_ORD 16 -#define POOL_SIZE (1 << POOL_ORD) - static void invert_bytes(unsigned char *p, unsigned long size) { unsigned int i; @@ -21,49 +20,62 @@ static bool sizes_ok(void *mem, unsigned long poolsize, void *p[], unsigned num) unsigned int i; for (i = 0; i < num; i++) - if (alloc_size(mem, poolsize, p[i]) < i) + if (p[i] && alloc_size(mem, poolsize, p[i]) < i) return false; return true; } -int main(int argc, char *argv[]) +static void test_pool(unsigned long pool_size) { + unsigned int i, j, num; void *mem; - unsigned int i, num; - void *p[POOL_SIZE]; - - plan_tests(5); + void **p; + bool flip = false; - /* FIXME: Needs to be page aligned for now. */ - if (posix_memalign(&mem, 1 << POOL_ORD, POOL_SIZE) != 0) - errx(1, "Failed allocating aligned memory"); + p = calloc(pool_size, sizeof(void *)); + mem = malloc(pool_size); - alloc_init(mem, POOL_SIZE); + alloc_init(mem, pool_size); /* Check that alloc_size() gives reasonable answers. */ - for (i = 0; i < POOL_SIZE; i++) { - p[i] = alloc_get(mem, POOL_SIZE, i, 1); + for (i = 0; i < pool_size; i = i * 3 / 2 + 1) { + p[i] = alloc_get(mem, pool_size, i, 1); if (!p[i]) break; - invert_bytes(p[i], alloc_size(mem, POOL_SIZE, p[i])); + invert_bytes(p[i], alloc_size(mem, pool_size, p[i])); } - ok1(i < POOL_SIZE); + ok1(i < pool_size); num = i; - ok1(alloc_check(mem, POOL_SIZE)); - ok1(sizes_ok(mem, POOL_SIZE, p, num)); + ok1(alloc_check(mem, pool_size)); + ok1(sizes_ok(mem, pool_size, p, num)); /* Free every second one. */ - for (i = 0; i < num; i+=2) { - alloc_free(mem, POOL_SIZE, p[i]); - /* Compact. */ - if (i + 1 < num) { - p[i/2] = p[i + 1]; - invert_bytes(p[i/2], alloc_size(mem,POOL_SIZE,p[i/2])); + for (i = j = 0; i < num; i = i * 3 / 2 + 1) { + flip = !flip; + if (flip) { + /* Compact. */ + p[j++] = p[i]; + invert_bytes(p[i], alloc_size(mem,pool_size,p[i])); + continue; } + alloc_free(mem, pool_size, p[i]); } num /= 2; - ok1(alloc_check(mem, POOL_SIZE)); - ok1(sizes_ok(mem, POOL_SIZE, p, num)); + ok1(alloc_check(mem, pool_size)); + ok1(sizes_ok(mem, pool_size, p, num)); + free(p); + free(mem); +} + +int main(int argc, char *argv[]) +{ + plan_tests(10); + + /* Large test. */ + test_pool(MIN_USEFUL_SIZE * 2); + + /* Small test. */ + test_pool(MIN_USEFUL_SIZE / 2); return exit_status(); }