-#include "alloc/alloc.h"
-#include "tap/tap.h"
-#include "alloc/alloc.c"
+#include <ccan/alloc/alloc.h>
+#include <ccan/tap/tap.h>
+#include <ccan/alloc/alloc.c>
+#include <ccan/alloc/bitops.c>
+#include <ccan/alloc/tiny.c>
#include <stdlib.h>
#include <stdbool.h>
#include <err.h>
-#define POOL_ORD 16
-#define POOL_SIZE (1 << POOL_ORD)
-
static void invert_bytes(unsigned char *p, unsigned long size)
{
unsigned int i;
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)
{
- void *mem;
unsigned int i, num;
- void *p[POOL_SIZE];
-
- plan_tests(5);
+ void *mem;
+ 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 = 0; i < num; i = i * 3 / 2 + 1) {
+ flip = !flip;
+ if (flip) {
+ invert_bytes(p[i], alloc_size(mem,pool_size,p[i]));
+ continue;
}
+ alloc_free(mem, pool_size, p[i]);
+ p[i] = NULL;
}
- 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();
}