X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=alloc%2Ftest%2Frun.c;h=8cfe8b42ba00d3c40a14a533f6d644426341ff9e;hb=cf808b83eeed556181ca481b70a23d04df51237e;hp=b0fbe81ccbf3d609ca99ee9a879a84403906090a;hpb=c9f42c0a9387dc14b17c9c75c58d34bbcf52755b;p=ccan diff --git a/alloc/test/run.c b/alloc/test/run.c index b0fbe81c..8cfe8b42 100644 --- a/alloc/test/run.c +++ b/alloc/test/run.c @@ -1,5 +1,5 @@ #include "alloc/alloc.h" -#include "tap.h" +#include "tap/tap.h" #include "alloc/alloc.c" #include @@ -24,16 +24,35 @@ static bool unique(void *p[], unsigned int num) return true; } +static bool free_every_second_one(void *mem, unsigned int num, void *p[]) +{ + unsigned int i; + + /* Free every second one. */ + for (i = 0; i < num; i += 2) { + alloc_free(mem, POOL_SIZE, p[i]); + if (!alloc_check(mem, POOL_SIZE)) + return false; + } + for (i = 1; i < num; i += 2) { + alloc_free(mem, POOL_SIZE, p[i]); + if (!alloc_check(mem, POOL_SIZE)) + return false; + } + return true; +} + + int main(int argc, char *argv[]) { void *mem; unsigned int i, num, max_size; void *p[POOL_SIZE]; - plan_tests(141); + plan_tests(139); /* FIXME: Needs to be page aligned for now. */ - posix_memalign(&mem, getpagesize(), POOL_SIZE); + posix_memalign(&mem, 1 << POOL_ORD, POOL_SIZE); /* Small pool, all allocs fail, even 0-length. */ alloc_init(mem, 0); @@ -74,6 +93,12 @@ int main(int argc, char *argv[]) break; } + /* Uncomment this for a more intuitive view of what the + * allocator looks like after all these 1 byte allocs. */ +#if 0 + alloc_visualize(stderr, mem, POOL_SIZE); +#endif + num = i; /* Can't allocate this many. */ ok1(num != POOL_SIZE); @@ -85,15 +110,7 @@ int main(int argc, char *argv[]) /* Uniqueness check */ ok1(unique(p, num)); - /* Free every second one. */ - for (i = 0; i < num; i += 2) { - alloc_free(mem, POOL_SIZE, p[i]); - ok1(alloc_check(mem, POOL_SIZE)); - } - for (i = 1; i < num; i += 2) { - alloc_free(mem, POOL_SIZE, p[i]); - ok1(alloc_check(mem, POOL_SIZE)); - } + ok1(free_every_second_one(mem, num, p)); ok1(alloc_check(mem, POOL_SIZE)); /* Should be able to reallocate max size. */ @@ -111,14 +128,14 @@ int main(int argc, char *argv[]) ok1(alloc_check(mem, POOL_SIZE)); /* Alignment constraints should be met, as long as powers of two */ - for (i = 0; i < POOL_ORD-2 /* FIXME: Should be -1 */; i++) { + for (i = 0; i < POOL_ORD-1; i++) { p[i] = alloc_get(mem, POOL_SIZE, i, 1 << i); ok1(p[i]); ok1(((unsigned long)p[i] % (1 << i)) == 0); ok1(alloc_check(mem, POOL_SIZE)); } - for (i = 0; i < POOL_ORD-2 /* FIXME: Should be -1 */; i++) { + for (i = 0; i < POOL_ORD-1; i++) { alloc_free(mem, POOL_SIZE, p[i]); ok1(alloc_check(mem, POOL_SIZE)); } @@ -132,5 +149,47 @@ int main(int argc, char *argv[]) ok1(alloc_check(mem, POOL_SIZE)); } + /* Alignment check for a 0-byte allocation. Corner case. */ + p[0] = alloc_get(mem, POOL_SIZE, 0, 1 << (POOL_ORD - 1)); + ok1(alloc_check(mem, POOL_SIZE)); + alloc_free(mem, POOL_SIZE, p[0]); + ok1(alloc_check(mem, POOL_SIZE)); + + /* Force the testing of split metadata. */ + alloc_init(mem, POOL_SIZE); + for (i = 0; i < POOL_SIZE; i++) { + p[i] = alloc_get(mem, POOL_SIZE, getpagesize(), getpagesize()); + if (!p[i]) + break; + } + ok1(alloc_check(mem, POOL_SIZE)); + + /* Sort them. */ + sort(p, i-1, addr_cmp); + + /* Free all but the one next to the metadata. */ + for (i = 1; p[i]; i++) + alloc_free(mem, POOL_SIZE, p[i]); + ok1(alloc_check(mem, POOL_SIZE)); + + /* Now do a whole heap of subpage allocs. */ + for (i = 1; i < POOL_SIZE; i++) { + p[i] = alloc_get(mem, POOL_SIZE, 1, 1); + if (!p[i]) + break; + } + ok1(alloc_check(mem, POOL_SIZE)); + + /* Free up our page next to metadata, and should be able to alloc */ + alloc_free(mem, POOL_SIZE, p[0]); + ok1(alloc_check(mem, POOL_SIZE)); + p[0] = alloc_get(mem, POOL_SIZE, 1, 1); + ok1(p[0]); + + /* Clean up. */ + for (i = 0; p[i]; i++) + alloc_free(mem, POOL_SIZE, p[i]); + ok1(alloc_check(mem, POOL_SIZE)); + return exit_status(); }