#include "allocator.h" #include #include static void *stdlib_heap_alloc(const struct allocator *allocator, size_t size, int *rc); static void *stdlib_heap_realloc(const struct allocator *allocator, void *p, size_t size, int *rc); static int stdlib_heap_free(const struct allocator *allocator, void *p); static void *stdlib_strict_heap_alloc(const struct allocator *allocator, size_t size, int *rc); static void *stdlib_strict_heap_realloc(const struct allocator *allocator, void *p, size_t size, int *rc); static int stdlib_strict_heap_free(const struct allocator *allocator, void *p); const struct allocator stdlib_heap_allocator = { .alloc = stdlib_heap_alloc, .realloc = stdlib_heap_realloc, .free = stdlib_heap_free }; const struct allocator stdlib_strict_heap_allocator = { .alloc = stdlib_strict_heap_alloc, .realloc = stdlib_strict_heap_realloc, .free = stdlib_strict_heap_free }; void * stdlib_heap_alloc(const struct allocator *allocator, size_t size, int *rc) { void *p; p = malloc(size); if (rc && !p) *rc = errno; return p; } void * stdlib_heap_realloc(const struct allocator *allocator, void *p, size_t size, int *rc) { void *np; np = realloc(p, size); if (rc && !np) *rc = errno; return np; } int stdlib_heap_free(const struct allocator *allocator, void *p) { free(p); return 0; } void * stdlib_strict_heap_alloc(const struct allocator *allocator, size_t size, int *rc) { void *p; p = malloc(size); if (!p) abort(); return p; } void * stdlib_strict_heap_realloc(const struct allocator *allocator, void *p, size_t size, int *rc) { void *np; np = realloc(p, size); if (!np) abort(); return np; } int stdlib_strict_heap_free(const struct allocator *allocator, void *p) { free(p); return 0; } void * strict_allocator_alloc(const struct allocator *allocator, size_t size, int *rc) { const struct strict_allocator *strict_allocator; void *p; strict_allocator = ((void *) allocator) - offsetof(struct strict_allocator, allocator); p = strict_allocator->allocator_ul->alloc( strict_allocator->allocator_ul, size, rc); if (!p) abort(); return p; } void * strict_allocator_realloc(const struct allocator *allocator, void *p, size_t size, int *rc) { const struct strict_allocator *strict_allocator; void *np; strict_allocator = ((void *) allocator) - offsetof(struct strict_allocator, allocator); np = strict_allocator->allocator_ul->realloc( strict_allocator->allocator_ul, p, size, rc); if (!np) abort(); return np; } int strict_allocator_free(const struct allocator *allocator, void *p) { const struct strict_allocator *strict_allocator; int rc; strict_allocator = ((void *) allocator) - offsetof(struct strict_allocator, allocator); rc = strict_allocator->allocator_ul->free( strict_allocator->allocator_ul, p); if (rc) abort(); return 0; } void strict_allocator_init(struct strict_allocator *strict_allocator, const struct allocator *allocator_ul) { strict_allocator->allocator_ul = allocator_ul; strict_allocator->allocator.alloc = strict_allocator_alloc; strict_allocator->allocator.realloc = strict_allocator_realloc; strict_allocator->allocator.free = strict_allocator_free; }