packages feed

croaring-ffi-1.0: bench/sizes/allocation-counter.c

#include <stdlib.h>
#include <roaring/memory.h>

#if defined(__APPLE__)
#include <malloc/malloc.h>
static size_t usable_size(void *block) { return malloc_size(block); }
#else
#include <malloc.h>
static size_t usable_size(void *block) { return malloc_usable_size(block); }
#endif

static size_t allocated;

static void *counting_malloc(size_t size) {
    void *block = malloc(size);
    if (block) allocated += usable_size(block);
    return block;
}

static void *counting_realloc(void *block, size_t size) {
    size_t before = block ? usable_size(block) : 0;
    void *moved = realloc(block, size);
    if (moved) {
        allocated -= before;
        allocated += usable_size(moved);
    }
    return moved;
}

static void *counting_calloc(size_t count, size_t size) {
    void *block = calloc(count, size);
    if (block) allocated += usable_size(block);
    return block;
}

static void counting_free(void *block) {
    if (block) allocated -= usable_size(block);
    free(block);
}

static void *counting_aligned_malloc(size_t alignment, size_t size) {
    void *block = NULL;
    if (posix_memalign(&block, alignment, size) != 0) return NULL;
    allocated += usable_size(block);
    return block;
}

void croaring_ffi_count_allocations(void) {
    roaring_memory_t hooks = {
        counting_malloc, counting_realloc, counting_calloc,
        counting_free, counting_aligned_malloc, counting_free,
    };
    roaring_init_memory_hook(hooks);
}

size_t croaring_ffi_allocated_bytes(void) { return allocated; }