Update TODO statuses
This commit is contained in:
29
src/memory.c
29
src/memory.c
@@ -122,7 +122,7 @@ void ucl_object_delete(struct ucl_object *obj) {
|
||||
ucl_arena_put(object_arena, obj);
|
||||
}
|
||||
|
||||
void ucl_object_mark(struct ucl_object *obj) {
|
||||
static void ucl_object_mark(struct ucl_object *obj) {
|
||||
if (obj == NULL || obj->reachable) {
|
||||
return;
|
||||
}
|
||||
@@ -134,34 +134,45 @@ void ucl_object_mark(struct ucl_object *obj) {
|
||||
}
|
||||
}
|
||||
|
||||
void ucl_scope_mark(struct ucl_arena * arena, void *obj) {
|
||||
static void ucl_scope_mark(struct ucl_arena * arena, void *obj) {
|
||||
(void) arena;
|
||||
struct ucl_scope *scope = (struct ucl_scope *) obj;
|
||||
|
||||
ucl_object_mark(scope->list);
|
||||
}
|
||||
|
||||
void ucl_gc_unmark(struct ucl_arena * arena, void *obj) {
|
||||
static void ucl_gc_unmark(struct ucl_arena * arena, void *obj) {
|
||||
(void) arena;
|
||||
struct ucl_object *object = (struct ucl_object *) obj;
|
||||
object->reachable = 0;
|
||||
}
|
||||
|
||||
void ucl_gc_sweep(struct ucl_arena * arena, void *obj) {
|
||||
static void ucl_gc_sweep(struct ucl_arena * arena, void *obj) {
|
||||
(void) arena;
|
||||
struct ucl_object *object = (struct ucl_object *) obj;
|
||||
if (object->reachable == 0) {
|
||||
// TODO: Mapping across this is broken, since this is a recursive delete
|
||||
ucl_object_delete(object);
|
||||
ucl_object_delete(object);
|
||||
}
|
||||
}
|
||||
|
||||
static void ucl_gc_deleteall(struct ucl_arena * arena, void *obj) {
|
||||
(void) arena;
|
||||
struct ucl_object *object = (struct ucl_object *) obj;
|
||||
ucl_object_delete(object);
|
||||
}
|
||||
|
||||
|
||||
void ucl_gc() {
|
||||
ucl_arena_map(object_arena, ucl_gc_unmark);
|
||||
if (object_arena == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
ucl_arena_map(scope_arena, ucl_scope_mark);
|
||||
if (scope_arena != NULL) {
|
||||
ucl_arena_map(object_arena, ucl_gc_unmark);
|
||||
ucl_arena_map(scope_arena, ucl_scope_mark);
|
||||
ucl_arena_map(object_arena, ucl_gc_sweep);
|
||||
} else {
|
||||
ucl_arena_map(object_arena, ucl_gc_deleteall);
|
||||
}
|
||||
|
||||
ucl_arena_map(object_arena, ucl_gc_sweep);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user