diff options
-rw-r--r-- | spec/ruby/core/thread/join_spec.rb | 5 | ||||
-rw-r--r-- | thread.c | 11 |
2 files changed, 13 insertions, 3 deletions
diff --git a/spec/ruby/core/thread/join_spec.rb b/spec/ruby/core/thread/join_spec.rb index 06e9049808..213fe2e505 100644 --- a/spec/ruby/core/thread/join_spec.rb +++ b/spec/ruby/core/thread/join_spec.rb @@ -22,11 +22,10 @@ describe "Thread#join" do end it "raises TypeError if the argument is not a valid timeout" do - t = Thread.new { sleep } + t = Thread.new { } + t.join -> { t.join(:foo) }.should raise_error TypeError -> { t.join("bar") }.should raise_error TypeError - t.kill - t.join end it "returns nil if it is not finished when given a timeout" do @@ -1313,6 +1313,17 @@ thread_join_m(int argc, VALUE *argv, VALUE self) timeout = argv[0]; } + // Convert the timeout eagerly, so it's always converted and deterministic + if (timeout == Qnil) { + /* unlimited */ + } + else if (FIXNUM_P(timeout)) { + /* handled directly in thread_join_sleep() */ + } + else { + timeout = rb_to_float(timeout); + } + return thread_join(rb_thread_ptr(self), timeout); } |