From 095a81286a429064cd30462748664abd2f198f78 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 1 Sep 2025 12:38:11 -0500 Subject: [PATCH] Add per-thread finalizer calls in missing places. --- src/core/gc.c | 11 ++++++++--- src/core/vm.c | 12 ++++++------ test/suite-ev2.janet | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/core/gc.c b/src/core/gc.c index 074560af..aad993ad 100644 --- a/src/core/gc.c +++ b/src/core/gc.c @@ -346,6 +346,9 @@ static void janet_deinit_block(JanetGCObject *mem) { break; case JANET_MEMORY_ABSTRACT: { JanetAbstractHead *head = (JanetAbstractHead *)mem; + if (head->type->gcperthread) { + janet_assert(!head->type->gcperthread(head->data, head->size), "per-thread finalizer failed"); + } if (head->type->gc) { janet_assert(!head->type->gc(head->data, head->size), "finalizer failed"); } @@ -498,9 +501,8 @@ void janet_sweep() { if (!janet_truthy(items[i].value)) { void *abst = janet_unwrap_abstract(items[i].key); JanetAbstractHead *head = janet_abstract_head(abst); - /* Optional per-thread finalizer */ if (head->type->gcperthread) { - janet_assert(!head->type->gcperthread(head->data, head->size), "finalizer failed"); + janet_assert(!head->type->gcperthread(head->data, head->size), "per-thread finalizer failed"); } if (0 == janet_abstract_decref(abst)) { /* Run finalizer */ @@ -676,8 +678,11 @@ void janet_clear_memory(void) { for (int32_t i = 0; i < janet_vm.threaded_abstracts.capacity; i++) { if (janet_checktype(items[i].key, JANET_ABSTRACT)) { void *abst = janet_unwrap_abstract(items[i].key); + JanetAbstractHead *head = janet_abstract_head(abst); + if (head->type->gcperthread) { + janet_assert(!head->type->gcperthread(head->data, head->size), "per-thread finalizer failed"); + } if (0 == janet_abstract_decref(abst)) { - JanetAbstractHead *head = janet_abstract_head(abst); if (head->type->gc) { janet_assert(!head->type->gc(head->data, head->size), "finalizer failed"); } diff --git a/src/core/vm.c b/src/core/vm.c index a0dae1c8..0329b8e7 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -1677,6 +1677,12 @@ void janet_sandbox_assert(uint32_t forbidden_flags) { /* Clear all memory associated with the VM */ void janet_deinit(void) { +#ifdef JANET_NET + janet_net_deinit(); +#endif +#ifdef JANET_EV + janet_ev_deinit(); +#endif janet_clear_memory(); janet_symcache_deinit(); janet_free(janet_vm.roots); @@ -1692,10 +1698,4 @@ void janet_deinit(void) { janet_vm.root_fiber = NULL; janet_free(janet_vm.registry); janet_vm.registry = NULL; -#ifdef JANET_EV - janet_ev_deinit(); -#endif -#ifdef JANET_NET - janet_net_deinit(); -#endif } diff --git a/test/suite-ev2.janet b/test/suite-ev2.janet index 60cf2838..1d774b85 100644 --- a/test/suite-ev2.janet +++ b/test/suite-ev2.janet @@ -49,7 +49,7 @@ (while true (def item (ev/take thread-channel)) (when (= item :deadline) - (ev/deadline 0.1 nil (fiber/current) true)))) + (ev/deadline 0.1)))) (ev/thread worker nil :n super) (ev/give thread-channel :deadline) (ev/sleep 0.2)