aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicholas a. evans <nicholas.evans@gmail.com>2020-06-09 00:30:43 -0400
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-06-09 18:57:17 +0900
commitb6bae0ec4433bcea6ba94a50de344c2e3b90fee9 (patch)
treef3e38c24b533d0a590b129d09f77cc9c0ecf402d
parent964829495cbf7bff6ca8a03b6d90f81de4d0efba (diff)
downloadruby-b6bae0ec4433bcea6ba94a50de344c2e3b90fee9.tar.gz
Return seconds slept after Thread.scheduler wait_sleep
Kernel#sleep should still return seconds slept, even when using a Thread.scheduler. The return value of Scheduler#wait_sleep can be ignored.
-rw-r--r--process.c18
-rw-r--r--test/fiber/test_sleep.rb19
2 files changed, 27 insertions, 10 deletions
diff --git a/process.c b/process.c
index e8a786d55e..bb30a8645f 100644
--- a/process.c
+++ b/process.c
@@ -4920,20 +4920,20 @@ rb_f_spawn(int argc, VALUE *argv, VALUE _)
static VALUE
rb_f_sleep(int argc, VALUE *argv, VALUE _)
{
+ time_t beg = time(0);
VALUE scheduler = rb_current_thread_scheduler();
if (scheduler != Qnil) {
- VALUE result = rb_funcallv(scheduler, rb_intern("wait_sleep"), argc, argv);
- return RTEST(result);
- }
-
- time_t beg = time(0);
- if (argc == 0) {
- rb_thread_sleep_forever();
+ rb_funcallv(scheduler, rb_intern("wait_sleep"), argc, argv);
}
else {
- rb_check_arity(argc, 0, 1);
- rb_thread_wait_for(rb_time_interval(argv[0]));
+ if (argc == 0) {
+ rb_thread_sleep_forever();
+ }
+ else {
+ rb_check_arity(argc, 0, 1);
+ rb_thread_wait_for(rb_time_interval(argv[0]));
+ }
}
time_t end = time(0) - beg;
diff --git a/test/fiber/test_sleep.rb b/test/fiber/test_sleep.rb
index bfb892e2c6..4dadbb58bf 100644
--- a/test/fiber/test_sleep.rb
+++ b/test/fiber/test_sleep.rb
@@ -14,7 +14,7 @@ class TestFiberSleep < Test::Unit::TestCase
5.times do |i|
Fiber do
- sleep(i/100.0)
+ assert(sleep(i/100.0) >= 0)
items << i
end
end
@@ -27,4 +27,21 @@ class TestFiberSleep < Test::Unit::TestCase
assert_equal ITEMS, items
end
+
+ def test_sleep_returns_seconds_slept
+ seconds = nil
+
+ thread = Thread.new do
+ scheduler = Scheduler.new
+ Thread.current.scheduler = scheduler
+ Fiber do
+ seconds = sleep(2)
+ end
+ end
+
+ thread.join
+
+ assert(seconds >= 2, "actual: %p" % seconds)
+ end
+
end