ruby-changes:47102
From: usa <ko1@a...>
Date: Fri, 30 Jun 2017 19:44:54 +0900 (JST)
Subject: [ruby-changes:47102] usa:r59217 (ruby_2_3): merge revision(s) 58370, 58382: [Backport #13530]
usa 2017-06-30 19:44:46 +0900 (Fri, 30 Jun 2017) New Revision: 59217 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59217 Log: merge revision(s) 58370,58382: [Backport #13530] 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. thread_win32.c: fix index * thread_win32.c (w32_wait_events): fix wait object index in the case of interrupt_event is not usable. Modified directories: branches/ruby_2_3/ Modified files: branches/ruby_2_3/ChangeLog branches/ruby_2_3/thread_win32.c branches/ruby_2_3/version.h Index: ruby_2_3/version.h =================================================================== --- ruby_2_3/version.h (revision 59216) +++ ruby_2_3/version.h (revision 59217) @@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/version.h#L1 #define RUBY_VERSION "2.3.5" #define RUBY_RELEASE_DATE "2017-06-30" -#define RUBY_PATCHLEVEL 313 +#define RUBY_PATCHLEVEL 314 #define RUBY_RELEASE_YEAR 2017 #define RUBY_RELEASE_MONTH 6 Index: ruby_2_3/ChangeLog =================================================================== --- ruby_2_3/ChangeLog (revision 59216) +++ ruby_2_3/ChangeLog (revision 59217) @@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ChangeLog#L1 +Fri Jun 30 19:41:48 2017 Nobuyoshi Nakada <nobu@r...> + + * 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. + + * thread_win32.c (w32_wait_events): fix wait object index in the case of + interrupt_event is not usable. + Fri Jun 30 19:37:47 2017 KOSAKI Motohiro <kosaki.motohiro@g...> * io.c (nogvl_wait_for_single_fd): nogvl_wait_for_single_fd must wait Index: ruby_2_3/thread_win32.c =================================================================== --- ruby_2_3/thread_win32.c (revision 59216) +++ ruby_2_3/thread_win32.c (revision 59217) @@ -165,53 +165,34 @@ Init_native_thread(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_3/thread_win32.c#L165 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) { HANDLE *targets = events; HANDLE intr; + const int initcount = count; DWORD ret; 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); ret = WaitForMultipleObjects(count, targets, FALSE, timeout); thread_debug(" WaitForMultipleObjects end (ret: %lu)\n", ret); - if (ret == (DWORD)(WAIT_OBJECT_0 + count - 1) && th) { + if (ret == (DWORD)(WAIT_OBJECT_0 + initcount) && th) { errno = EINTR; } if (ret == WAIT_FAILED && THREAD_DEBUG) { @@ -689,7 +670,9 @@ ubf_handle(void *ptr) https://github.com/ruby/ruby/blob/trunk/ruby_2_3/thread_win32.c#L670 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 { Index: ruby_2_3 =================================================================== --- ruby_2_3 (revision 59216) +++ ruby_2_3 (revision 59217) Property changes on: ruby_2_3 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /trunk:r58370,58382 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/