some small updates

This commit is contained in:
2026-02-28 04:34:30 +00:00
committed by oreodave
parent 9940651ac0
commit 30a87d4a1b
3 changed files with 19 additions and 12 deletions

View File

@@ -92,14 +92,15 @@ We'll need an allocator for all our managed objects. Requirements:
- Able to tag allocations as unused (i.e. "free") and able to reuse - Able to tag allocations as unused (i.e. "free") and able to reuse
these allocations these allocations
- This will link into the garbage collector, which should yield a - This will link into the garbage collector, which should yield a
sequence of objects that should be "freed". sequence of objects that were previously tagged as unfree and
should be "freed".
- Able to allocate all the managed types we have - Able to allocate all the managed types we have
**** TODO Design allocation data structures **** TODO Design allocation data structures
**** TODO Design allocation methods for different lisp types **** TODO Design allocation methods for different lisp types
- Conses
- Vectors
- Strings (when implemented) - Strings (when implemented)
**** TODO Design allocation freeing methods ***** TODO Conses
***** TODO Vectors
**** TODO Design allocation freeing method
*** TODO Design garbage collection scheme :gc: *** TODO Design garbage collection scheme :gc:
Really, regardless of what I do, we need to have some kind of garbage Really, regardless of what I do, we need to have some kind of garbage
collection header on whatever managed objects we allocate. We need to collection header on whatever managed objects we allocate. We need to

View File

@@ -68,8 +68,8 @@ alloc_node_t *lisp_to_node(lisp_t *lisp)
return NIL; return NIL;
} }
alloc_metadata_t *data = raw_ptr; alloc_node_t *node = raw_ptr;
return (alloc_node_t *)(&data[-1]); return &node[-1];
} }
lisp_t *alloc_make(alloc_t *alloc, tag_t type) lisp_t *alloc_make(alloc_t *alloc, tag_t type)
@@ -95,27 +95,33 @@ lisp_t *alloc_make(alloc_t *alloc, tag_t type)
for (u64 i = 0; i < free_list_size; ++i) for (u64 i = 0; i < free_list_size; ++i)
{ {
alloc_node_t **nodeptr = &VEC_GET(&alloc->free_list, i, alloc_node_t *); alloc_node_t **nodeptr = &VEC_GET(&alloc->free_list, i, alloc_node_t *);
// Skip any nodes that don't have the right type.
if (nodeptr[0]->metadata.tag != type) if (nodeptr[0]->metadata.tag != type)
continue; continue;
// Swap this node with the last item of the free_list assert("Expected free node to have no references" &&
nodeptr[0]->metadata.references == 0);
// Pop this node off the free_list by swapping it with the last item and
// decrementing the size of the free_list.
alloc_node_t **lastptr = alloc_node_t **lastptr =
&VEC_GET(&alloc->free_list, free_list_size - 1, alloc_node_t *); &VEC_GET(&alloc->free_list, free_list_size - 1, alloc_node_t *);
alloc_node_t *val = *nodeptr;
alloc_node_t *val = *lastptr;
*nodeptr = *lastptr; *nodeptr = *lastptr;
*lastptr = val; *lastptr = val;
// Decrement the size of the free list // Decrement the size of the free list
alloc->free_list.size -= sizeof(val); alloc->free_list.size -= sizeof(val);
// Get the valid node and goto the end. // Then use that valid (and now unused) node as our return.
node = *lastptr; node = *lastptr;
goto end; goto end;
} }
// We couldn't get anything from the free list, so try to allocate a fresh one // We couldn't get anything from the free_list, so try to allocate a fresh one
// against one of the pages. // against one of the pages.
for (u64 i = 0; i < VEC_SIZE(&alloc->pages, page_t *); ++i) for (u64 i = 0; i < VEC_SIZE(&alloc->pages, page_t *); ++i)
{ {

View File

@@ -54,7 +54,7 @@ void stream_test_prologue(void)
void stream_test_epilogue(void) void stream_test_epilogue(void)
{ {
TEST_INFO("Freeing resources and deleting file `%s`\n", valid_filename); TEST_INFO("Deleting file `%s`\n", valid_filename);
assert(valid_fp); assert(valid_fp);
fclose(valid_fp); fclose(valid_fp);
remove(valid_filename); remove(valid_filename);