diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-09-13 01:43:03 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-09-13 01:43:03 +0000 |
commit | 8a7b4b397f986d6d6290c49af91d58072749a66f (patch) | |
tree | 444ee0748d1e2ba768e2ab028926f76cca624f5b /thread.c | |
parent | 12409ad28cf909f84ccae8096bba2beb442266df (diff) | |
download | ruby-8a7b4b397f986d6d6290c49af91d58072749a66f.tar.gz |
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
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 4 |
1 files changed, 4 insertions, 0 deletions
@@ -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; |