int ruby_vm_destruct(void *ptr) { RUBY_FREE_ENTER("vm"); if (ptr) { rb_vm_t *vm = ptr; rb_thread_t *th = vm->main_thread; #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE struct rb_objspace *objspace = vm->objspace; #endif rb_gc_force_recycle(vm->self); vm->main_thread = 0; if (th) { thread_free(th); } if (vm->living_threads) { st_free_table(vm->living_threads); vm->living_threads = 0; } rb_thread_lock_unlock(&vm->global_vm_lock); rb_thread_lock_destroy(&vm->global_vm_lock); ruby_xfree(vm); ruby_current_vm = 0; #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE if (objspace) { rb_objspace_free(objspace); } #endif } RUBY_FREE_LEAVE("vm"); return 0; }
int ruby_vm_destruct(rb_vm_t *vm) { RUBY_FREE_ENTER("vm"); if (vm) { rb_thread_t *th = vm->main_thread; #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE struct rb_objspace *objspace = vm->objspace; #endif rb_gc_force_recycle(vm->self); vm->main_thread = 0; if (th) { thread_free(th); } if (vm->living_threads) { st_free_table(vm->living_threads); vm->living_threads = 0; } #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE if (objspace) { rb_objspace_free(objspace); } #endif ruby_vm_run_at_exit_hooks(vm); rb_vm_gvl_destroy(vm); ruby_xfree(vm); ruby_current_vm = 0; } RUBY_FREE_LEAVE("vm"); return 0; }