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…
	
	Add table
		Add a link
		
	
		Reference in a new issue