From 7206ac5492ba3f94b9aea510f04ccab80a57dbb9 Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 16 Apr 2017 14:27:21 +0000 Subject: [PATCH] thread_win32.c: no GVL for interrupt_event * thread_win32.c (w32_wait_events): do not acquire GVL, to fix deadlock at read/close race condition. instead, just ignore interrupt_event if it is closed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58370 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- thread_win32.c | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/thread_win32.c b/thread_win32.c index 01d58a26d8..3edb998695 100644 --- a/thread_win32.c +++ b/thread_win32.c @@ -158,22 +158,6 @@ Init_native_thread(void) th->native_thread_data.interrupt_event); } -static void -w32_set_event(HANDLE handle) -{ - if (SetEvent(handle) == 0) { - w32_error("w32_set_event"); - } -} - -static void -w32_reset_event(HANDLE handle) -{ - if (ResetEvent(handle) == 0) { - w32_error("w32_reset_event"); - } -} - static int w32_wait_events(HANDLE *events, int count, DWORD timeout, rb_thread_t *th) { @@ -184,20 +168,16 @@ w32_wait_events(HANDLE *events, int count, DWORD timeout, rb_thread_t *th) thread_debug(" w32_wait_events events:%p, count:%d, timeout:%ld, th:%p\n", events, count, timeout, th); if (th && (intr = th->native_thread_data.interrupt_event)) { - gvl_acquire(th->vm, th); - if (intr == th->native_thread_data.interrupt_event) { - w32_reset_event(intr); - if (RUBY_VM_INTERRUPTED(th)) { - w32_set_event(intr); - } - + if (ResetEvent(intr) && (!RUBY_VM_INTERRUPTED(th) || SetEvent(intr))) { targets = ALLOCA_N(HANDLE, count + 1); memcpy(targets, events, sizeof(HANDLE) * count); targets[count++] = intr; thread_debug(" * handle: %p (count: %d, intr)\n", intr, count); } - gvl_release(th->vm); + else if (intr == th->native_thread_data.interrupt_event) { + w32_error("w32_wait_events"); + } } thread_debug(" WaitForMultipleObjects start (count: %d)\n", count); @@ -682,7 +662,9 @@ ubf_handle(void *ptr) rb_thread_t *th = (rb_thread_t *)ptr; thread_debug("ubf_handle: %p\n", th); - w32_set_event(th->native_thread_data.interrupt_event); + if (!SetEvent(th->native_thread_data.interrupt_event)) { + w32_error("ubf_handle"); + } } static struct {