Home | History | Annotate | Download | only in integration
      1 #include "test/jemalloc_test.h"
      2 
      3 /* Tests je_iterate added by src/android_je_iterate.c */
      4 
      5 int je_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*);
      6 
      7 static size_t alloc_count;
      8 static size_t alloc_size;
      9 static uintptr_t alloc_find;
     10 static size_t alloc_find_size;
     11 static bool alloc_found;
     12 
     13 static void callback(uintptr_t ptr, size_t size, void* arg) {
     14   alloc_count++;
     15   alloc_size += size;
     16   if (ptr <= alloc_find && alloc_find < ptr + size) {
     17     assert(alloc_find + alloc_find_size <= ptr + size);
     18     alloc_found = true;
     19   }
     20 }
     21 
     22 TEST_BEGIN(test_iterate_alloc)
     23 {
     24 
     25 #define MAXSZ (((size_t)1) << 26)
     26   size_t sz;
     27 
     28   for (sz = 1; sz < MAXSZ; sz <<= 1) {
     29     void *ptr;
     30     ptr = malloc(sz);
     31     assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz);
     32 
     33     alloc_count = 0;
     34     alloc_size = 0;
     35     alloc_find = (uintptr_t)ptr;
     36     alloc_find_size = sz;
     37     alloc_found = false;
     38 
     39     mallctl("thread.tcache.flush", NULL, NULL, NULL, 0);
     40 
     41     assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0);
     42 
     43     assert(alloc_found);
     44 
     45     free(ptr);
     46   }
     47 #undef MAXSZ
     48 }
     49 TEST_END
     50 
     51 TEST_BEGIN(test_iterate_dalloc)
     52 {
     53 
     54 #define MAXSZ (((size_t)1) << 26)
     55   size_t sz;
     56 
     57   for (sz = 1; sz < MAXSZ; sz <<= 1) {
     58     void *ptr;
     59     ptr = malloc(sz);
     60     free(ptr);
     61     assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz);
     62 
     63     alloc_count = 0;
     64     alloc_size = 0;
     65     alloc_find = (uintptr_t)ptr;
     66     alloc_find_size = sz;
     67     alloc_found = false;
     68 
     69     mallctl("thread.tcache.flush", NULL, NULL, NULL, 0);
     70 
     71     je_iterate((uintptr_t)ptr, sz, callback, NULL);
     72 
     73     assert(!alloc_found);
     74   }
     75 #undef MAXSZ
     76 }
     77 TEST_END
     78 
     79 TEST_BEGIN(test_iterate_free_first)
     80 {
     81 #define MAXSZ (((size_t)1) << 26)
     82   size_t sz;
     83 
     84   for (sz = 1; sz < MAXSZ; sz <<= 1) {
     85     void *ptr;
     86     void *ptr2;
     87     ptr2 = malloc(sz);
     88     assert_ptr_not_null(ptr2, "malloc() failed for size %zu", sz);
     89 
     90     ptr = malloc(sz);
     91     assert_ptr_not_null(ptr, "malloc() failed for size %zu", sz);
     92 
     93     free(ptr2);
     94 
     95     alloc_count = 0;
     96     alloc_size = 0;
     97     alloc_find = (uintptr_t)ptr;
     98     alloc_find_size = sz;
     99     alloc_found = false;
    100 
    101     mallctl("thread.tcache.flush", NULL, NULL, NULL, 0);
    102 
    103     assert(je_iterate((uintptr_t)ptr, sz, callback, NULL) == 0);
    104 
    105     assert(alloc_found);
    106 
    107     free(ptr);
    108   }
    109 #undef MAXSZ
    110 }
    111 TEST_END
    112 
    113 int
    114 main(void)
    115 {
    116 
    117   return (test(
    118       test_iterate_alloc,
    119       test_iterate_dalloc,
    120       test_iterate_free_first));
    121 }
    122