From 6a9c567b3810c1518a8ecd014215baf21fa934d2 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 6 Sep 2013 00:37:14 +1000 Subject: [PATCH] bitmap: Add helper macro to statically declare bitmaps For use as direct locals, or when the size is a constant, inside structure definitions. Signed-off-by: David Gibson --- ccan/bitmap/_info | 1 + ccan/bitmap/bitmap.h | 3 +++ ccan/bitmap/test/run.c | 33 +++++++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ccan/bitmap/_info b/ccan/bitmap/_info index 26214726..2038058f 100644 --- a/ccan/bitmap/_info +++ b/ccan/bitmap/_info @@ -23,6 +23,7 @@ int main(int argc, char *argv[]) if (strcmp(argv[1], "testdepends") == 0) { printf("ccan/array_size\n"); + printf("ccan/foreach\n"); return 0; } diff --git a/ccan/bitmap/bitmap.h b/ccan/bitmap/bitmap.h index 259b3514..f43449d7 100644 --- a/ccan/bitmap/bitmap.h +++ b/ccan/bitmap/bitmap.h @@ -22,6 +22,9 @@ typedef struct { bitmap_word w; } bitmap; +#define BITMAP_DECLARE(_name, _nbits) \ + bitmap (_name)[BITMAP_NWORDS(_nbits)] + static inline size_t bitmap_sizeof(int nbits) { return BITMAP_NWORDS(nbits) * sizeof(bitmap_word); diff --git a/ccan/bitmap/test/run.c b/ccan/bitmap/test/run.c index 5911a363..b67172a5 100644 --- a/ccan/bitmap/test/run.c +++ b/ccan/bitmap/test/run.c @@ -1,6 +1,7 @@ #include #include #include +#include int bitmap_sizes[] = { 1, 2, 3, 4, 5, 6, 7, 8, @@ -11,13 +12,21 @@ int bitmap_sizes[] = { #define NSIZES ARRAY_SIZE(bitmap_sizes) #define NTESTS 9 -static void test_sizes(int nbits) +static void test_sizes(int nbits, bool dynalloc) { - bitmap *bitmap = bitmap_alloc(nbits); + BITMAP_DECLARE(sbitmap, nbits); + uint32_t marker; + bitmap *bitmap; int i, j; bool wrong; - ok1(bitmap != NULL); + if (dynalloc) { + bitmap = bitmap_alloc(nbits); + ok1(bitmap != NULL); + } else { + bitmap = sbitmap; + marker = 0xdeadbeef; + } bitmap_zero(bitmap, nbits); wrong = false; @@ -78,20 +87,28 @@ static void test_sizes(int nbits) wrong = wrong || bitmap_full(bitmap, nbits); } ok1(!wrong); - - free(bitmap); + + if (dynalloc) { + free(bitmap); + } else { + ok1(marker == 0xdeadbeef); + } } int main(void) { int i; + bool dynalloc; /* This is how many tests you plan to run */ - plan_tests(NSIZES * NTESTS); + plan_tests(NSIZES * NTESTS * 2); for (i = 0; i < NSIZES; i++) { - diag("Testing %d-bit bitmap", bitmap_sizes[i]); - test_sizes(bitmap_sizes[i]); + foreach_int(dynalloc, false, true) { + diag("Testing %d-bit bitmap (%s allocation)", + bitmap_sizes[i], dynalloc ? "dynamic" : "static"); + test_sizes(bitmap_sizes[i], dynalloc); + } } /* This exits depending on whether all tests passed */ -- 2.39.2