#include "recycler.h" #include struct recycler *recycler_create(size_t block_size, size_t total_size) { if (block_size % sizeof(size_t) || !block_size || !total_size || total_size % block_size) return NULL; struct recycler *rec = malloc(sizeof(struct recycler)); if (rec == NULL) return NULL; rec->block_size = block_size; rec->capacity = total_size / block_size; rec->chunk = malloc(total_size * sizeof(void *)); if (rec->chunk == NULL) { free(rec); return NULL; } rec->free = rec->chunk; struct free_list *f = rec->free; for (size_t i = 0; i < rec->capacity - 1; i++) { f->next = f + block_size; f = f->next; } f->next = NULL; return rec; } void recycler_destroy(struct recycler *r) { if (r == NULL) return; free(r->chunk); free(r); } void *recycler_allocate(struct recycler *r) { if (r == NULL || r->free == NULL) return NULL; void *res = r->free; struct free_list *f = r->free; r->free = f->next; return res; } void recycler_free(struct recycler *r, void *block) { if (r == NULL || block == NULL) return; struct free_list *old_head = r->free; r->free = block; struct free_list *b = block; b->next = old_head; }