From: KOSAKI Motohiro Date: 2011-09-20T18:16:51+09:00 Subject: [ruby-core:39638] Re: [Ruby 1.9 - Bug #5342][Open] ConditionVariable can wake a Thread that is no longer waiting on it Hi 2011/9/20 Eric Wong : > Mike Perham wrote: >> ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0] >> >> See gist at https://gist.github.com/1228184 for a reproducible test case. > > I can confirm the test case fails on 1.9.2-p290 on x86_32 Linux, too. > > ruby_1_9_3 r33290 appears good, however. �The GVL was reimplemented for > 1.9.3 to improve fairness and performance, so there are likely bugs > fixed along the way. The bug was fixed by following commit. (r27711) It haven't backported 1.9.2 yet. commit f4053cf5554deb0051aabfc90180784236f1f25b Author: mame Date: Sun May 9 17:10:18 2010 +0000 * lib/thread.rb (ConditionVariable#wait): ensure to remove the current thread from waiters. [ruby-core:29835] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27711 b2dd03c8-39d4-4d8f-98ff-823fe69b080e diff --git a/ChangeLog b/ChangeLog index 7677a70..91c0e41 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon May 10 02:07:20 2010 Yusuke Endoh + + * lib/thread.rb (ConditionVariable#wait): ensure to remove the current + thread from waiters. [ruby-core:29835] + Mon May 10 00:54:15 2010 Nobuyoshi Nakada * ext/io/console/console.c (console_set_raw): new method. diff --git a/lib/thread.rb b/lib/thread.rb index f3831a7..88f834c 100644 --- a/lib/thread.rb +++ b/lib/thread.rb @@ -69,6 +69,10 @@ class ConditionVariable @waiters.push(Thread.current) end mutex.sleep timeout + ensure + @waiters_mutex.synchronize do + @waiters.delete(Thread.current) + end end self end