thread.c (rb_thread_atfork): reinitialize current th->interrupt_lock

Another thread may be holding th->interrupt_lock while our
current thread calls fork.  Therefore we must reinitialize our
own th->interrupt_lock in the child process because the owner
of the lock is only in the parent.  The original parent process
is unaffected.  We cannot destroy the lock while it has an unknown
state, either, so some implementations can leak a small amount
of memory, here (NPTL won't).

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64707 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-09-13 01:43:03 +00:00
parent 12409ad28c
commit 8a7b4b397f

View File

@ -4363,6 +4363,10 @@ rb_thread_atfork_internal(rb_thread_t *th, void (*atfork)(rb_thread_t *, const r
/* may be held by MJIT threads in parent */
rb_native_mutex_initialize(&vm->waitpid_lock);
/* may be held by any thread in parent */
rb_native_mutex_initialize(&th->interrupt_lock);
vm->fork_gen++;
vm->sleeper = 0;