summaryrefslogtreecommitdiffstats
path: root/lib/generator.rb
diff options
context:
space:
mode:
authorocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-12-29 16:08:44 +0000
committerocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-12-29 16:08:44 +0000
commita84c72ff83f63ca1e3cd06fb02e4b823e6273bb7 (patch)
tree1d8ea6f225ef9091674932921c8873ae3ad57bef /lib/generator.rb
parentc5221139d5bf98c189adcfe2e7d99db06f8bb439 (diff)
downloadruby-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.rb19
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