Project

General

Profile

Bug #9342 » 0001-Wake-waiting-threads-when-SizedQueue-clear-is-called.patch

jsc (Justin Collins), 01/02/2014 02:00 PM

View differences:

lib/thread.rb
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:
test/thread/test_queue.rb
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-1/2)