#pragma once #include #include #define MAGIC_COOKIE_BYTES 32 #define ADDRESS_BITS (8 * sizeof(void*)) struct buddy { uint8_t magic[MAGIC_COOKIE_BYTES]; struct free_block *(avail[ADDRESS_BITS]); size_t root_logsize; void *base; }; // NOTE: after init_buddy, *state should never move. void init_buddy(uint8_t *base, size_t size, uint8_t magic[MAGIC_COOKIE_BYTES], struct buddy *state); void *allocate(size_t size, struct buddy *state); void liberate(void *base, size_t size, struct buddy *state); void debug_buddy(struct buddy *state); void *reallocate(void *old, size_t old_size, size_t new_size, struct buddy *state); int reserve(void *start, size_t size, struct buddy *state); // grow can also be used to move the buddy. grow can never fail. void grow_buddy(uint8_t *new_base, size_t new_size, struct buddy *state); // 0 -> failure. always in-place. to do out-of-place, first shrink then grow. int shrink_buddy(size_t new_size, struct buddy *state);