diff options
author | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-12-30 09:57:49 +0000 |
---|---|---|
committer | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-12-30 09:57:49 +0000 |
commit | c0c75769b689b34be85e2b7e1b92016e7b67563e (patch) | |
tree | 8342c6ea31470588e8d0d764ab3531d672cf8636 /lib | |
parent | 2c1706fffb3fed17085af23de26ce84ed8ebae1a (diff) | |
download | ruby-c0c75769b689b34be85e2b7e1b92016e7b67563e.tar.gz |
Sorry, reverted. Mutex is damn slow.....
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9774 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/generator.rb | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/lib/generator.rb b/lib/generator.rb index 19f2385449..241987faba 100644 --- a/lib/generator.rb +++ b/lib/generator.rb @@ -23,7 +23,6 @@ # # See the respective classes for examples of usage. -require "thread" # # Generator converts an internal iterator (i.e. an Enumerable object) @@ -72,24 +71,17 @@ class Generator end @index = 0 @queue = [] - @mutex = Mutex.new - @main_cond = ConditionVariable.new - @loop_cond = ConditionVariable.new - entered = false @loop_thread = Thread.new do - @mutex.synchronize do - entered = true - @loop_cond.wait(@mutex) - begin - @block.call(self) - rescue - @main_thread.raise $! - ensure - @main_cond.signal - end + Thread.stop + begin + @block.call(self) + rescue + @main_thread.raise + ensure + @main_thread.wakeup end end - Thread.pass until entered && !@mutex.locked? + Thread.pass until @loop_thread.stop? self end @@ -98,26 +90,33 @@ class Generator if Thread.current != @loop_thread raise "should be called in Generator.new{|g| ... }" end - @queue << value - @main_cond.signal - @loop_cond.wait(@mutex) + Thread.critical = true + begin + @queue << value + @main_thread.wakeup + Thread.stop + ensure + Thread.critical = false + end self end # Returns true if the generator has reached the end. def end? - @mutex.synchronize do - if @queue.empty? && @loop_thread.alive? - if @main_thread - raise "should not be called in Generator.new{|g| ... }" - end - begin - @main_thread = Thread.current - @loop_cond.signal - @main_cond.wait(@mutex) - ensure - @main_thread = nil - end + if @queue.empty? + if @main_thread + raise "should not be called in Generator.new{|g| ... }" + end + Thread.critical = true + begin + @main_thread = Thread.current + @loop_thread.wakeup + Thread.stop + rescue ThreadError + # ignore + ensure + @main_thread = nil + Thread.critical = false end end @queue.empty? |