mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
thread.c (thread_join_m): handle negative timeouts correctly
Users may subtract and round into negative values when using
Thread#join, so clamp the timeout to zero to avoid infinite/long
timeouts.
Note: other methods such as Kernel#sleep and IO.select will
raise on negative values, but Thread#join is an outlier *shrug*
This restores Ruby 2.5 (and earlier) behavior.
Fixes: r62182 (commit c915390b95)
("thread.c: avoid FP for Thread#join")
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62462 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
fbad2c5592
commit
ecd2c08a4c
2 changed files with 11 additions and 2 deletions
|
|
@ -234,6 +234,13 @@ class TestThread < Test::Unit::TestCase
|
|||
t = Thread.new {}
|
||||
assert_same t, t.join(limit), "limit=#{limit.inspect}"
|
||||
end
|
||||
t = Thread.new { sleep }
|
||||
[ -1, -0.1, RbConfig::LIMITS['FIXNUM_MIN'], RbConfig::LIMITS['INT64_MIN'],
|
||||
-Float::INFINITY
|
||||
].each do |limit|
|
||||
assert_nil t.join(limit), "limit=#{limit.inspect}"
|
||||
end
|
||||
t.kill
|
||||
end
|
||||
|
||||
def test_kill_main_thread
|
||||
|
|
|
|||
6
thread.c
6
thread.c
|
|
@ -1061,6 +1061,8 @@ thread_join_m(int argc, VALUE *argv, VALUE self)
|
|||
case T_NIL: break;
|
||||
case T_FIXNUM:
|
||||
timespec.tv_sec = NUM2TIMET(limit);
|
||||
if (timespec.tv_sec < 0)
|
||||
timespec.tv_sec = 0;
|
||||
timespec.tv_nsec = 0;
|
||||
ts = ×pec;
|
||||
break;
|
||||
|
|
@ -1116,8 +1118,8 @@ double2timespec(struct timespec *ts, double d)
|
|||
if (TIMESPEC_SEC_MAX_PLUS_ONE <= d) {
|
||||
return NULL;
|
||||
}
|
||||
else if (d <= TIMESPEC_SEC_MIN) {
|
||||
ts->tv_sec = TIMESPEC_SEC_MIN;
|
||||
else if (d <= 0) {
|
||||
ts->tv_sec = 0;
|
||||
ts->tv_nsec = 0;
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue