aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/gc.c b/gc.c
index 6469e98b58..a7f92806ae 100644
--- a/gc.c
+++ b/gc.c
@@ -366,6 +366,8 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#define need_call_final (finalizer_table && finalizer_table->num_entries)
+static void rb_objspace_call_finalizer(rb_objspace_t *objspace);
+
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
rb_objspace_t *
rb_objspace_alloc(void)
@@ -377,6 +379,33 @@ rb_objspace_alloc(void)
return objspace;
}
+
+void
+rb_objspace_free(rb_objspace_t *objspace)
+{
+ rb_objspace_call_finalizer(objspace);
+ if (objspace->profile.record) {
+ free(objspace->profile.record);
+ objspace->profile.record = 0;
+ }
+ if (global_List) {
+ struct gc_list *list, *next;
+ for (list = global_List; list; list = next) {
+ next = list->next;
+ free(list);
+ }
+ }
+ if (heaps) {
+ int i;
+ for (i = 0; i < heaps_used; ++i) {
+ free(heaps[i].membase);
+ }
+ free(heaps);
+ heaps_used = 0;
+ heaps = 0;
+ }
+ free(objspace);
+}
#endif
/* tiny heap size */
@@ -2613,7 +2642,12 @@ chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
void
rb_gc_call_finalizer_at_exit(void)
{
- rb_objspace_t *objspace = &rb_objspace;
+ rb_objspace_call_finalizer(&rb_objspace);
+}
+
+void
+rb_objspace_call_finalizer(rb_objspace_t *objspace)
+{
RVALUE *p, *pend;
RVALUE *final_list = 0;
size_t i;