diff options
| author | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-12-29 16:08:44 +0000 |
|---|---|---|
| committer | ocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-12-29 16:08:44 +0000 |
| commit | a84c72ff83f63ca1e3cd06fb02e4b823e6273bb7 (patch) | |
| tree | 1d8ea6f225ef9091674932921c8873ae3ad57bef /lib/generator.rb | |
| parent | c5221139d5bf98c189adcfe2e7d99db06f8bb439 (diff) | |
| download | ruby-a84c72ff83f63ca1e3cd06fb02e4b823e6273bb7.tar.gz ruby-a84c72ff83f63ca1e3cd06fb02e4b823e6273bb7.tar.xz ruby-a84c72ff83f63ca1e3cd06fb02e4b823e6273bb7.zip | |
* lib/generator.rb: should work with another thread. (more robust code)
[ruby-dev:28177]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@9763 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/generator.rb')
| -rw-r--r-- | lib/generator.rb | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/generator.rb b/lib/generator.rb index 5b13bb965..1086e0fbe 100644 --- a/lib/generator.rb +++ b/lib/generator.rb @@ -73,14 +73,12 @@ class Generator @queue = [] @loop_thread = Thread.new do Thread.stop - Thread.critical = true begin @block.call(self) # exception safe? rescue @main_thread.raise $! ensure @main_thread.wakeup - Thread.critical = false end end self @@ -89,21 +87,28 @@ class Generator # Yields an element to the generator. def yield(value) if Thread.current != @loop_thread - raise RuntimeError.new("Generator#yield must be called in Generator.new{|g| ... }") + raise "should be called in Generator.new{|g| ... }" end - @queue << value - @main_thread.wakeup - Thread.stop 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? if @queue.empty? + if @main_thread + raise "should not be called in Generator.new{|g| ... }" + end Thread.critical = true - @main_thread = Thread.current begin + @main_thread = Thread.current @loop_thread.wakeup Thread.stop rescue ThreadError |
