diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | lib/thread.rb | 16 | ||||
-rw-r--r-- | test/thread/test_queue.rb | 22 | ||||
-rw-r--r-- | version.h | 6 |
4 files changed, 50 insertions, 3 deletions
@@ -1,3 +1,12 @@ +Fri Feb 14 12:45:07 2014 NAKAMURA Usaku <usa@ruby-lang.org> + + * lib/thread.rb (SizedQueue#clear): wake waiting threads when called. + [Bug #9342] [ruby-core:59462] + + * test/thread/test_queue.rb: add a test for above. + + patched by Justin Collins. + Thu Feb 6 09:06:00 2014 Kenta Murata <mrkn@cookpad.com> * configure.in (POSTLINK): sign built program using RUBY_CODESIGN diff --git a/lib/thread.rb b/lib/thread.rb index 58c4f6b9e6..494a5b33e4 100644 --- a/lib/thread.rb +++ b/lib/thread.rb @@ -355,6 +355,22 @@ class SizedQueue < Queue def num_waiting @waiting.size + @queue_wait.size end + + # + # Removes all objects from the queue and wakes waiting threads, if any. + # + def clear + @mutex.synchronize do + @que.clear + begin + until @queue_wait.empty? + @queue_wait.shift.wakeup + end + rescue ThreadError + retry + end + end + end end # Documentation comments: diff --git a/test/thread/test_queue.rb b/test/thread/test_queue.rb index b0ffe0866d..9d8d481ba4 100644 --- a/test/thread/test_queue.rb +++ b/test/thread/test_queue.rb @@ -10,6 +10,28 @@ class TestQueue < Test::Unit::TestCase grind(5, 1000, 15, SizedQueue, 1000) end + def test_sized_queue_clear + # Fill queue, then test that SizedQueue#clear wakes up all waiting threads + sq = SizedQueue.new(2) + 2.times { sq << 1 } + + t1 = Thread.new do + sq << 1 + end + + t2 = Thread.new do + sq << 1 + end + + t3 = Thread.new do + Thread.pass + sq.clear + end + + [t3, t2, t1].each(&:join) + assert_equal sq.length, 2 + end + def grind(num_threads, num_objects, num_iterations, klass, *args) from_workers = klass.new(*args) to_workers = klass.new(*args) @@ -1,10 +1,10 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 515 +#define RUBY_PATCHLEVEL 516 -#define RUBY_RELEASE_DATE "2014-02-06" +#define RUBY_RELEASE_DATE "2014-02-14" #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 2 -#define RUBY_RELEASE_DAY 6 +#define RUBY_RELEASE_DAY 14 #include "ruby/version.h" |