mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/thread.rb (ConditionVariable): use hash instead of array for
@waiters. * test/thread/test_queue.rb (test_sized_queue_and_wakeup): remove a test because @waiters no longer have a chance to duplicated. Now it's a hash. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38109 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f9aef18497
commit
1f1db611b9
3 changed files with 15 additions and 25 deletions
|
@ -1,3 +1,11 @@
|
|||
Sat Dec 1 14:23:33 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||
|
||||
* lib/thread.rb (ConditionVariable): use hash instead of array for
|
||||
@waiters.
|
||||
* test/thread/test_queue.rb (test_sized_queue_and_wakeup): remove
|
||||
a test because @waiters no longer have a chance to duplicated. Now it's
|
||||
a hash.
|
||||
|
||||
Sat Dec 1 17:16:54 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* misc/ruby-electric.el (ruby-electric-curlies): use kill-region
|
||||
|
|
|
@ -52,7 +52,7 @@ class ConditionVariable
|
|||
# Creates a new ConditionVariable
|
||||
#
|
||||
def initialize
|
||||
@waiters = []
|
||||
@waiters = {}
|
||||
@waiters_mutex = Mutex.new
|
||||
end
|
||||
|
||||
|
@ -67,7 +67,7 @@ class ConditionVariable
|
|||
begin
|
||||
Thread.async_interrupt_timing(StandardError => :on_blocking) do
|
||||
@waiters_mutex.synchronize do
|
||||
@waiters.push(Thread.current)
|
||||
@waiters[Thread.current] = true
|
||||
end
|
||||
mutex.sleep timeout
|
||||
end
|
||||
|
@ -86,10 +86,10 @@ class ConditionVariable
|
|||
def signal
|
||||
Thread.async_interrupt_timing(StandardError => :on_blocking) do
|
||||
begin
|
||||
t = @waiters_mutex.synchronize {@waiters.shift}
|
||||
t, _ = @waiters_mutex.synchronize { @waiters.shift }
|
||||
t.run if t
|
||||
rescue ThreadError
|
||||
retry # t was alread dead?
|
||||
retry # t was already dead?
|
||||
end
|
||||
end
|
||||
self
|
||||
|
@ -100,12 +100,12 @@ class ConditionVariable
|
|||
#
|
||||
def broadcast
|
||||
Thread.async_interrupt_timing(StandardError => :on_blocking) do
|
||||
waiters0 = nil
|
||||
threads = nil
|
||||
@waiters_mutex.synchronize do
|
||||
waiters0 = @waiters.dup
|
||||
threads = @waiters.keys
|
||||
@waiters.clear
|
||||
end
|
||||
for t in waiters0
|
||||
for t in threads
|
||||
begin
|
||||
t.run
|
||||
rescue ThreadError
|
||||
|
|
|
@ -56,24 +56,6 @@ class TestQueue < Test::Unit::TestCase
|
|||
assert_equal(1, q.max)
|
||||
end
|
||||
|
||||
def test_sized_queue_and_wakeup
|
||||
sq = SizedQueue.new(1)
|
||||
sq.push(0)
|
||||
|
||||
t1 = Thread.start { sq.push(1) ; sleep }
|
||||
|
||||
sleep 0.1 until t1.stop?
|
||||
t1.wakeup
|
||||
sleep 0.1 until t1.stop?
|
||||
|
||||
t2 = Thread.start { sq.push(2) }
|
||||
sleep 0.1 until t1.stop? && t2.stop?
|
||||
|
||||
enque_cond = sq.instance_eval{ @enque_cond }
|
||||
queue_wait = enque_cond.instance_eval { @waiters }
|
||||
assert_equal(queue_wait.uniq, queue_wait)
|
||||
end
|
||||
|
||||
def test_queue_pop_interrupt
|
||||
q = Queue.new
|
||||
t1 = Thread.new { q.pop }
|
||||
|
|
Loading…
Reference in a new issue