aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--lib/thread.rb14
-rw-r--r--test/thread/test_queue.rb18
3 files changed, 15 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 294074e2ff..2977cdc504 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/lib/thread.rb b/lib/thread.rb
index 47add67e89..04847c80ab 100644
--- a/lib/thread.rb
+++ b/lib/thread.rb
@@ -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
diff --git a/test/thread/test_queue.rb b/test/thread/test_queue.rb
index b6fbbaeb33..ec743772f8 100644
--- a/test/thread/test_queue.rb
+++ b/test/thread/test_queue.rb
@@ -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 }