1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* process.c (rb_clock_gettime): Support times() based monotonic clock.

(rb_clock_getres): Ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42795 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2013-09-03 03:10:41 +00:00
parent c048ad23b6
commit bc3d736f43
3 changed files with 65 additions and 0 deletions

View file

@ -1,3 +1,8 @@
Tue Sep 3 12:09:08 2013 Tanaka Akira <akr@fsij.org>
* process.c (rb_clock_gettime): Support times() based monotonic clock.
(rb_clock_getres): Ditto.
Tue Sep 3 12:03:02 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (str2big_scan_digits): Extracted from rb_cstr_to_inum.

View file

@ -6926,6 +6926,17 @@ get_mach_timebase_info(void)
* [:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC]
* Use mach_absolute_time(), available on Darwin.
* The resolution is CPU dependent.
* [:TIMES_BASED_CLOCK_MONOTONIC]
* Use the result value of times() defined by POSIX.
* POSIX defines it as "times() shall return the elapsed real time, in clock ticks, since an arbitrary point in the past (for example, system start-up time)".
* For example, GNU/Linux returns a value based on jiffies and it is monotonic.
* However, 4.4BSD uses gettimeofday() and it is not monotonic.
* (FreeBSD uses clock_gettime(CLOCK_MONOTONIC) instead, though.)
* The resolution is the clock tick.
* "getconf CLK_TCK" command shows the clock ticks per second.
* (The clock ticks per second is defined by HZ macro in older systems.)
* If it is 100 and clock_t is 32 bits integer type, the resolution is 10 milli second and
* cannot represent over 497 days.
*
* Emulations for +CLOCK_PROCESS_CPUTIME_ID+:
* [:GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID]
@ -7022,6 +7033,24 @@ rb_clock_gettime(int argc, VALUE *argv)
goto success;
}
#ifdef HAVE_TIMES
#define RUBY_TIMES_BASED_CLOCK_MONOTONIC \
ID2SYM(rb_intern("TIMES_BASED_CLOCK_MONOTONIC"))
if (clk_id == RUBY_TIMES_BASED_CLOCK_MONOTONIC) {
struct tms buf;
clock_t c;
unsigned_clock_t uc;
c = times(&buf);
if (c == (clock_t)-1)
rb_sys_fail("times");
uc = (unsigned_clock_t)c;
tt.count = (int32_t)(uc % 1000000000);
tt.giga_count = (uc / 1000000000);
denominators[num_denominators++] = get_clk_tck();
goto success;
}
#endif
#ifdef RUSAGE_SELF
#define RUBY_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID \
ID2SYM(rb_intern("GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID"))
@ -7186,6 +7215,15 @@ rb_clock_getres(int argc, VALUE *argv)
}
#endif
#ifdef RUBY_TIMES_BASED_CLOCK_MONOTONIC
if (clk_id == RUBY_TIMES_BASED_CLOCK_MONOTONIC) {
tt.count = 1;
tt.giga_count = 0;
denominators[num_denominators++] = get_clk_tck();
goto success;
}
#endif
#ifdef RUBY_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
if (clk_id == RUBY_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID) {
tt.giga_count = 0;

View file

@ -1693,6 +1693,16 @@ EOS
assert_kind_of(Float, t, "Process.clock_gettime(:#{n})")
end
def test_clock_gettime_TIMES_BASED_CLOCK_MONOTONIC
n = :TIMES_BASED_CLOCK_MONOTONIC
begin
t = Process.clock_gettime(n)
rescue Errno::EINVAL
return
end
assert_kind_of(Float, t, "Process.clock_gettime(:#{n})")
end
def test_clock_gettime_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
n = :GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
begin
@ -1761,6 +1771,18 @@ EOS
assert_equal(1000000000, Process.clock_getres(n, :nanosecond))
end
def test_clock_getres_TIMES_BASED_CLOCK_MONOTONIC
n = :TIMES_BASED_CLOCK_MONOTONIC
begin
t = Process.clock_getres(n)
rescue Errno::EINVAL
return
end
assert_kind_of(Float, t, "Process.clock_getres(:#{n})")
f = Process.clock_getres(n, :hertz)
assert_equal(0, f - f.floor)
end
def test_clock_getres_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
n = :GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
begin