diff --git a/allocator.h b/allocator.h index 98a912b..d72637d 100644 --- a/allocator.h +++ b/allocator.h @@ -10,6 +10,9 @@ typedef union any_align { char c; int i; long l; long long ll; float f; double d #define KB (1024) #define MB (KB * KB) #define GB (KB * KB * KB) +#define OFFSET(STRUCT, FIELD) ((size_t) (&((STRUCT*) NULL)->FIELD)) +#define PTR_FROM_FIELD_PTR(STRUCT, FIELD, PTR) ((STRUCT *) (((char *) PTR) - OFFSET(STRUCT, FIELD))) + // Contains all operations an allocator can do. Similar interface to sdtlibs // malloc, realloc and free. diff --git a/borrow_allocator.c b/borrow_allocator.c index 26d3b80..affd88a 100644 --- a/borrow_allocator.c +++ b/borrow_allocator.c @@ -1,17 +1,25 @@ #include "allocator.h" - void *borrow_allcoator_alloc(borrow_allocator_t *this, size_t bytes) { linked_allocation_node_t *node = malloc(sizeof(*this->head) + bytes); + if (node == NULL) { return NULL; } node->prev = NULL; node->next = this->head; if (this->head != NULL) { - // TODO: correct? - this->head.prev = node; + this->head->prev = node; } this->head = node; } + +// WARNING: it is important to consider the case where the old_node is the head +// node. + void *borrow_allcoator_resize(borrow_allocator_t *this, void *old_ptr, size_t bytes) { + linked_allocation_node_t *old_node = PTR_FROM_FIELD_PTR(linked_allocation_node_t, data, old_ptr); + // TODO: update the links } void borrow_allcoator_free(borrow_allocator_t *this, void *old_ptr) { + linked_allocation_node_t *old_node = PTR_FROM_FIELD_PTR(linked_allocation_node_t, data, old_ptr); + // TODO: update the links + free(old_node); }