diff --git a/cont.c b/cont.c index e345ac42c1c9cb..2b60860eddf9f9 100644 --- a/cont.c +++ b/cont.c @@ -2587,12 +2587,12 @@ rb_threadptr_root_fiber_release(rb_thread_t *th) /* ignore. A root fiber object will free th->ec */ } else { - rb_execution_context_t *ec = GET_EC(); + rb_execution_context_t *ec = rb_current_execution_context(false); VM_ASSERT(th->ec->fiber_ptr->cont.type == FIBER_CONTEXT); VM_ASSERT(th->ec->fiber_ptr->cont.self == 0); - if (th->ec == ec) { + if (ec && th->ec == ec) { rb_ractor_set_current_ec(th->ractor, NULL); } fiber_free(th->ec->fiber_ptr); diff --git a/vm.c b/vm.c index 633445957903ab..96f4189b14026c 100644 --- a/vm.c +++ b/vm.c @@ -3056,7 +3056,8 @@ ruby_vm_destruct(rb_vm_t *vm) rb_objspace_free_objects(objspace); rb_free_generic_iv_tbl_(); rb_free_default_rand_key(); - if (th) { + if (th && vm->fork_gen == 0) { + /* If we have forked, main_thread may not be the initial thread */ xfree(stack); ruby_mimfree(th); }