summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-09-01 15:09:06 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-09-01 15:09:06 +0000
commit8a108ffc214545a5f144e3de82d37c67efa27939 (patch)
tree405bc7151ba34c58a897228a05165b276acd7bf2 /process.c
parentb64c2c348f05784cb3dad92c97093baf3e93885f (diff)
* process.c (get_mach_timebase_info): Extracted from rb_clock_gettime.
(rb_clock_gettime): Use get_mach_timebase_info. (rb_clock_getres): Support MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42763 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/process.c b/process.c
index 32b7237d34..07649f1b0c 100644
--- a/process.c
+++ b/process.c
@@ -6851,6 +6851,20 @@ make_clock_result(struct timetick *ttp,
rb_raise(rb_eArgError, "unexpected unit: %"PRIsVALUE, unit);
}
+#ifdef __APPLE__
+static mach_timebase_info_data_t *
+get_mach_timebase_info(void)
+{
+ static mach_timebase_info_data_t sTimebaseInfo;
+
+ if ( sTimebaseInfo.denom == 0 ) {
+ (void) mach_timebase_info(&sTimebaseInfo);
+ }
+
+ return &sTimebaseInfo;
+}
+#endif
+
/*
* call-seq:
* Process.clock_gettime(clock_id [, unit]) -> number
@@ -7069,17 +7083,12 @@ rb_clock_gettime(int argc, VALUE *argv)
#ifdef __APPLE__
#define RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC ID2SYM(rb_intern("MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC"))
if (clk_id == RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC) {
- static mach_timebase_info_data_t sTimebaseInfo;
- uint64_t t = mach_absolute_time();
-
- if ( sTimebaseInfo.denom == 0 ) {
- (void) mach_timebase_info(&sTimebaseInfo);
- }
-
+ mach_timebase_info_data_t *info = get_mach_timebase_info();
+ uint64_t t = mach_absolute_time();
tt.count = (int32_t)(t % 1000000000);
tt.giga_count = t / 1000000000;
- numerators[num_numerators++] = sTimebaseInfo.numer;
- denominators[num_denominators++] = sTimebaseInfo.denom;
+ numerators[num_numerators++] = info->numer;
+ denominators[num_denominators++] = info->denom;
denominators[num_denominators++] = 1000000000;
goto success;
}
@@ -7205,7 +7214,15 @@ rb_clock_getres(int argc, VALUE *argv)
#endif
#ifdef RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC
- /* not yet */
+ if (clk_id == RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC) {
+ mach_timebase_info_data_t *info = get_mach_timebase_info();
+ tt.count = 1;
+ tt.giga_count = 0;
+ numerators[num_numerators++] = info->numer;
+ denominators[num_denominators++] = info->denom;
+ denominators[num_denominators++] = 1000000000;
+ goto success;
+ }
#endif
}
else {