diff options
author | Adam Hess <adamhess1991@gmail.com> | 2023-10-12 11:15:53 -0700 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-12-07 15:52:35 -0500 |
commit | 6816e8efcff3be75f8020cd1b0ea57d3cd664bbc (patch) | |
tree | 8f8484b955ba25e9df6a2038db0f156e7cbf71e4 /marshal.c | |
parent | b361a800c22e0248bf126d77e96a7bd4f9c34d1b (diff) | |
download | ruby-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.c | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -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; } |