diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2019-06-20 20:29:35 +1200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2019-06-20 22:36:30 +1200 |
commit | f607e433520218ac2adc93fcf32bc3b797219a60 (patch) | |
tree | 789d187b051851772df194454e219b5e7c4063d8 /thread.c | |
parent | 3077cb6912033d18f4d34fd64011e9f8e9502b99 (diff) |
Transition root fiber into state FIBER_TERMINATED.
During fork, it's possible that threads with root fibers are terminated,
but fiber state is not updated. `fiber_verify` will subsequently fail. We
forcefully enter the FIBER_TERMINATED state when terminating the root
fiber.
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -591,6 +591,8 @@ rb_thread_terminate_all(void) EC_POP_TAG(); } +void rb_threadptr_root_fiber_terminate(rb_thread_t *th); + static void thread_cleanup_func_before_exec(void *th_ptr) { @@ -599,8 +601,7 @@ thread_cleanup_func_before_exec(void *th_ptr) // The thread stack doesn't exist in the forked process: th->ec->machine.stack_start = th->ec->machine.stack_end = NULL; - // The vm_stack is `alloca`ed on the thread stack, so it's gone too: - rb_ec_clear_vm_stack(th->ec); + rb_threadptr_root_fiber_terminate(th); } static void |