[前][次][番号順一覧][スレッド一覧]

ruby-changes:30716

From: akr <ko1@a...>
Date: Tue, 3 Sep 2013 12:10:47 +0900 (JST)
Subject: [ruby-changes:30716] akr:r42795 (trunk): * process.c (rb_clock_gettime): Support times() based monotonic clock.

akr	2013-09-03 12:10:41 +0900 (Tue, 03 Sep 2013)

  New Revision: 42795

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=42795

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

  Modified files:
    trunk/ChangeLog
    trunk/process.c
    trunk/test/ruby/test_process.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 42794)
+++ ChangeLog	(revision 42795)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Sep  3 12:09:08 2013  Tanaka Akira  <akr@f...>
+
+	* process.c (rb_clock_gettime): Support times() based monotonic clock.
+	  (rb_clock_getres): Ditto.
+
 Tue Sep  3 12:03:02 2013  Tanaka Akira  <akr@f...>
 
 	* bignum.c (str2big_scan_digits): Extracted from rb_cstr_to_inum.
Index: process.c
===================================================================
--- process.c	(revision 42794)
+++ process.c	(revision 42795)
@@ -6926,6 +6926,17 @@ get_mach_timebase_info(void) https://github.com/ruby/ruby/blob/trunk/process.c#L6926
  *  [: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) https://github.com/ruby/ruby/blob/trunk/process.c#L7033
             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"))
@@ -7185,6 +7214,15 @@ rb_clock_getres(int argc, VALUE *argv) https://github.com/ruby/ruby/blob/trunk/process.c#L7214
             goto success;
         }
 #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) {
Index: test/ruby/test_process.rb
===================================================================
--- test/ruby/test_process.rb	(revision 42794)
+++ test/ruby/test_process.rb	(revision 42795)
@@ -1693,6 +1693,16 @@ EOS https://github.com/ruby/ruby/blob/trunk/test/ruby/test_process.rb#L1693
     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 https://github.com/ruby/ruby/blob/trunk/test/ruby/test_process.rb#L1771
     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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]