summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--spec/ruby/core/thread/join_spec.rb5
-rw-r--r--thread.c11
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
diff --git a/thread.c b/thread.c
index d6a4f7ab78..510d8a028b 100644
--- a/thread.c
+++ b/thread.c
@@ -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);
}