diff options
author | Peter Zhu <peter@peterzhu.ca> | 2024-02-05 14:41:29 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2024-02-06 10:54:05 -0500 |
commit | a50e35888b9bc5428a30b95c0ded12ddb986354f (patch) | |
tree | 816562b23cb86b70fe3b05010fbe74b62e659384 /gc.c | |
parent | 1c120023f19becf0c5e56a6d62f7c101c440953f (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.c | 14 |
1 files changed, 5 insertions, 9 deletions
@@ -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; } } |