aboutsummaryrefslogtreecommitdiffstats
path: root/marshal.c
diff options
context:
space:
mode:
authorAdam Hess <adamhess1991@gmail.com>2023-10-12 11:15:53 -0700
committerPeter Zhu <peter@peterzhu.ca>2023-12-07 15:52:35 -0500
commit6816e8efcff3be75f8020cd1b0ea57d3cd664bbc (patch)
tree8f8484b955ba25e9df6a2038db0f156e7cbf71e4 /marshal.c
parentb361a800c22e0248bf126d77e96a7bd4f9c34d1b (diff)
downloadruby-6816e8efcff3be75f8020cd1b0ea57d3cd664bbc.tar.gz
Free everything at shutdown
when the RUBY_FREE_ON_SHUTDOWN environment variable is set, manually free memory at shutdown. Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org> Co-authored-by: Peter Zhu <peter@peterzhu.ca>
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/marshal.c b/marshal.c
index 2774db07fd..1cd71efd54 100644
--- a/marshal.c
+++ b/marshal.c
@@ -2517,6 +2517,20 @@ Init_marshal(void)
rb_define_const(rb_mMarshal, "MINOR_VERSION", INT2FIX(MARSHAL_MINOR));
}
+static int
+free_compat_i(st_data_t key, st_data_t value, st_data_t _)
+{
+ xfree((marshal_compat_t *)value);
+ return ST_CONTINUE;
+}
+
+static void
+free_compat_allocator_table(void *data)
+{
+ st_foreach(data, free_compat_i, 0);
+ st_free_table(data);
+}
+
static st_table *
compat_allocator_table(void)
{
@@ -2525,7 +2539,7 @@ compat_allocator_table(void)
#undef RUBY_UNTYPED_DATA_WARNING
#define RUBY_UNTYPED_DATA_WARNING 0
compat_allocator_tbl_wrapper =
- Data_Wrap_Struct(0, mark_marshal_compat_t, 0, compat_allocator_tbl);
+ Data_Wrap_Struct(0, mark_marshal_compat_t, free_compat_allocator_table, compat_allocator_tbl);
rb_gc_register_mark_object(compat_allocator_tbl_wrapper);
return compat_allocator_tbl;
}