run-testsize.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "alloc/alloc.h"
  2. #include "tap/tap.h"
  3. #include "alloc/alloc.c"
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6. #include <err.h>
  7. #define POOL_ORD 16
  8. #define POOL_SIZE (1 << POOL_ORD)
  9. static void invert_bytes(unsigned char *p, unsigned long size)
  10. {
  11. unsigned int i;
  12. for (i = 0; i < size; i++)
  13. p[i] ^= 0xFF;
  14. }
  15. static bool sizes_ok(void *mem, unsigned long poolsize, void *p[], unsigned num)
  16. {
  17. unsigned int i;
  18. for (i = 0; i < num; i++)
  19. if (alloc_size(mem, poolsize, p[i]) < i)
  20. return false;
  21. return true;
  22. }
  23. int main(int argc, char *argv[])
  24. {
  25. void *mem;
  26. unsigned int i, num;
  27. void *p[POOL_SIZE];
  28. plan_tests(5);
  29. /* FIXME: Needs to be page aligned for now. */
  30. if (posix_memalign(&mem, 1 << POOL_ORD, POOL_SIZE) != 0)
  31. errx(1, "Failed allocating aligned memory");
  32. alloc_init(mem, POOL_SIZE);
  33. /* Check that alloc_size() gives reasonable answers. */
  34. for (i = 0; i < POOL_SIZE; i++) {
  35. p[i] = alloc_get(mem, POOL_SIZE, i, 1);
  36. if (!p[i])
  37. break;
  38. invert_bytes(p[i], alloc_size(mem, POOL_SIZE, p[i]));
  39. }
  40. ok1(i < POOL_SIZE);
  41. num = i;
  42. ok1(alloc_check(mem, POOL_SIZE));
  43. ok1(sizes_ok(mem, POOL_SIZE, p, num));
  44. /* Free every second one. */
  45. for (i = 0; i < num; i+=2) {
  46. alloc_free(mem, POOL_SIZE, p[i]);
  47. /* Compact. */
  48. if (i + 1 < num) {
  49. p[i/2] = p[i + 1];
  50. invert_bytes(p[i/2], alloc_size(mem,POOL_SIZE,p[i/2]));
  51. }
  52. }
  53. num /= 2;
  54. ok1(alloc_check(mem, POOL_SIZE));
  55. ok1(sizes_ok(mem, POOL_SIZE, p, num));
  56. return exit_status();
  57. }