int main() { struct lf_lifo head; void *val1 = mmap_aligned(MAP_SIZE); void *val2 = mmap_aligned(MAP_SIZE); void *val3 = mmap_aligned(MAP_SIZE); lf_lifo_init(&head); fail_unless(lf_lifo_pop(&head) == NULL); fail_unless(lf_lifo_pop(lf_lifo_push(&head, val1)) == val1); fail_unless(lf_lifo_pop(lf_lifo_push(&head, val1)) == val1); lf_lifo_push(lf_lifo_push(lf_lifo_push(&head, val1), val2), val3); fail_unless(lf_lifo_pop(&head) == val3); fail_unless(lf_lifo_pop(&head) == val2); fail_unless(lf_lifo_pop(&head) == val1); fail_unless(lf_lifo_pop(&head) == NULL); lf_lifo_init(&head); /* Test overflow of ABA counter. */ int i = 0; do { lf_lifo_push(&head, val1); fail_unless(lf_lifo_pop(&head) == val1); fail_unless(lf_lifo_pop(&head) == NULL); i++; } while (head.next != 0); munmap(val1, MAP_SIZE); munmap(val2, MAP_SIZE); munmap(val3, MAP_SIZE); printf("success\n"); return 0; }
void slab_unmap(struct slab_arena *arena, void *ptr) { if (ptr) lf_lifo_push(&arena->cache, ptr); }