summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-02-05 14:41:29 -0500
committerPeter Zhu <peter@peterzhu.ca>2024-02-06 10:54:05 -0500
commita50e35888b9bc5428a30b95c0ded12ddb986354f (patch)
tree816562b23cb86b70fe3b05010fbe74b62e659384 /gc.c
parent1c120023f19becf0c5e56a6d62f7c101c440953f (diff)
Free all remaining objects in rb_objspace_free_objects
rb_objspace_call_finalizer didn't free fibers and neither did rb_objspace_free_objects, which caused fibers to be reported as leaked when using RUBY_FREE_AT_EXIT. This commit changes rb_objspace_free_objects to free all remaining Ruby objects.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/gc.c b/gc.c
index 7414e929a6..124f2158ff 100644
--- a/gc.c
+++ b/gc.c
@@ -3810,7 +3810,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
RB_DEBUG_COUNTER_INC(obj_imemo_constcache);
break;
}
- return TRUE;
+ break;
default:
rb_bug("gc_sweep(): unknown data type 0x%x(%p) 0x%"PRIxVALUE,
@@ -3822,6 +3822,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
return FALSE;
}
else {
+ RBASIC(obj)->flags = 0;
return TRUE;
}
}
@@ -4616,16 +4617,11 @@ rb_objspace_free_objects(rb_objspace_t *objspace)
for (; p < pend; p += stride) {
VALUE vp = (VALUE)p;
switch (BUILTIN_TYPE(vp)) {
- case T_DATA: {
- if (rb_obj_is_mutex(vp) || rb_obj_is_thread(vp) || rb_obj_is_main_ractor(vp)) {
- obj_free(objspace, vp);
- }
- break;
- }
- case T_ARRAY:
- obj_free(objspace, vp);
+ case T_NONE:
+ case T_SYMBOL:
break;
default:
+ obj_free(objspace, vp);
break;
}
}