diff --git a/Makefile b/Makefile index 043d5ff..8137fea 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC = gcc CFLAGS = -O3 -Wall -Wextra -Wpedantic -SRCS = main.c vm.c gc.c +SRCS = main.c vm.c gc.c galloc.c OBJS = $(SRCS:.c=.o) EXE = gc diff --git a/gc_alloc.c b/gc_alloc.c new file mode 100644 index 0000000..11a823e --- /dev/null +++ b/gc_alloc.c @@ -0,0 +1,49 @@ +#include +#include + +#include "gc_alloc.h" + +static void *allocHead = NULL; + +struct gcHeader *findFree(struct gcHeader **prev, size_t size) { + struct gcHeader *curr = allocHead; + + while (curr && !(curr->free && curr->size >= size)) { + *prev = curr; + curr = curr->next; + } + + return curr; +} + +struct gcHeader *requestMem(struct gcHeader *prev, size_t size) { + struct gcHeader *block; + void *request; + + block = sbrk(0); + if (block == (void *)-1) { + perror("sbrk block"); + return NULL; + } + + request = sbrk(size + sizeof(struct gcHeader)); + if (request == (void *)-1) { + perror("sbrk request"); + return NULL; + } + + if ((void *)block != request) { + fprintf(stderr, "gcHeader: block != request"); + return NULL; + } + + if (prev) { + prev->next = block; + } + + block->size = size; + block->next = NULL; + block->free = 0; + + return block; +} diff --git a/gc_alloc.h b/gc_alloc.h new file mode 100644 index 0000000..652bddc --- /dev/null +++ b/gc_alloc.h @@ -0,0 +1,26 @@ +#ifndef GALLOC_H +#define GALLOC_H + +#include + +// Metadata for allocated memory - Headers are stored in a linked list to keep +// track of alloc's and free's +struct gcHeader { + size_t size; + int free; + struct gcHeader *next; +}; + +// Iterates over the galloc linked list attempting to find free space +struct gcHeader *findFree(struct gcHeader **prev, size_t size); + +// Requests more memory from the kernel +struct gcHeader *requestMem(struct gcHeader *prev, size_t size); + +// Performs allocations +void *galloc(size_t size); + +// Frees memory allocated with galloc() +void gfree(void *ptr); + +#endif /* GALLOC_H */