Project

General

Profile

Feature #15609 ยป ruby-changes.patch

gabewild37 (Gabe Wild), 08/13/2019 04:26 PM

View differences:

process.c
/*
* call-seq:
* sleep([duration]) -> integer
* sleep([duration]) -> integer/float
*
* Suspends the current thread for _duration_ seconds (which may be any number,
* including a +Float+ with fractional seconds). Returns the actual number of
* seconds slept (rounded), which may be less than that asked for if another
* thread calls Thread#run. Called without an argument, sleep()
* will sleep forever.
* including a +Float+ with fractional seconds). Returns the actual time slept,
* which may be less than that asked for if another thread calls Thread#run.
* Given an float input, the function returns the precise time slept, up to
* the microsecond; otherwise it returns the seconds slept. Called without an
* argument, sleep() will sleep forever.
*
* Time.new #=> 2008-03-08 19:56:19 +0900
* sleep 1.2 #=> 1
* sleep 1 #=> 1
* Time.new #=> 2008-03-08 19:56:20 +0900
* sleep 1.9 #=> 2
* Time.new #=> 2008-03-08 19:56:22 +0900
* sleep 1.0 #=> 1.xxxxxx
* Time.new #=> 2008-03-08 19:56:21 +0900
*/
static VALUE
rb_f_sleep(int argc, VALUE *argv)
{
time_t beg, end;
struct timeval beg, end;
gettimeofday(&beg, NULL);
beg = time(0);
if (argc == 0) {
rb_thread_sleep_forever();
rb_thread_sleep_forever();
}
else {
rb_check_arity(argc, 0, 1);
rb_thread_wait_for(rb_time_interval(argv[0]));
rb_check_arity(argc, 0, 1);
rb_thread_wait_for(rb_time_interval(argv[0]));
}
end = time(0) - beg;
gettimeofday(&end, NULL);
return INT2FIX(end);
double total_time = end.tv_sec - beg.tv_sec;
switch(TYPE(argv[0])){
default:
return INT2NUM((int)total_time);
case T_FLOAT:
total_time += (end.tv_usec - beg.tv_usec) * 1e-6;
return DBL2NUM(total_time);
}
}
test/ruby/test_sleep.rb
ensure
GC.enable
end
def test_sleep_return
GC.disable
ret = sleep 0
assert_equal(ret, 0)
ret = sleep 0.0
assert_not_equal(ret, 0)
assert_operator(slept, :>=, 0.0)
assert_operator(slept, :<=, 1.0)
ensure
GC.enable
end
end
    (1-1/1)