Feature #8777 ยป mach_absolute.patch
| configure.in | ||
|---|---|---|
| AC_CHECK_FUNCS(chroot) | ||
| AC_CHECK_FUNCS(chsize) | ||
| AC_CHECK_FUNCS(clock_gettime) | ||
| AC_CHECK_FUNCS(mach_absolute_time) | ||
| AC_CHECK_FUNCS(cosh) | ||
| AC_CHECK_FUNCS(daemon) | ||
| AC_CHECK_FUNCS(dl_iterate_phdr) | ||
| process.c | ||
|---|---|---|
| #ifdef HAVE_SYS_TIMES_H | ||
| #include <sys/times.h> | ||
| #endif | ||
| #ifdef HAVE_MACH_ABSOLUTE_TIME | ||
| #include <mach/mach_time.h> | ||
| #endif | ||
| #ifdef HAVE_PWD_H | ||
| #include <pwd.h> | ||
| ... | ... | |
| #define rb_proc_times rb_f_notimplement | ||
| #endif | ||
| #ifdef HAVE_MACH_ABSOLUTE_TIME | ||
| #if SIZEOF_LONG == 8 | ||
| # define UINT64toNUM(x) ULONG2NUM(x) | ||
| # define NUMtoUINT64(x) NUM2ULONG(x) | ||
| #elif defined(HAVE_LONG_LONG) && SIZEOF_LONG_LONG == 8 | ||
| # define UINT64toNUM(x) ULL2NUM(x) | ||
| # define NUMtoUINT64(x) NUM2ULL(x) | ||
| #endif | ||
| static mach_timebase_info_data_t sTimebaseInfo; | ||
| /* | ||
|  *  call-seq: | ||
|  *     Process.mach_absolute_time()   -> number | ||
|  * | ||
|  *  Returns an absolute number representing the time and is CPU dependent. | ||
|  */ | ||
| static VALUE | ||
| rb_mach_absolute_time(VALUE mod) | ||
| { | ||
|     return UINT64toNUM(mach_absolute_time()); | ||
| } | ||
| static VALUE | ||
| rb_absolute_to_ns(VALUE mod, VALUE _abs) | ||
| { | ||
|     uint64_t abs; | ||
|     uint64_t ns; | ||
|     abs = NUMtoUINT64(_abs); | ||
|     ns = abs * sTimebaseInfo.numer / sTimebaseInfo.denom; | ||
|     return UINT64toNUM(ns); | ||
| } | ||
| #endif | ||
| /* | ||
|  *  call-seq: | ||
|  *     Process.clock_gettime(clk_id [, unit])   -> number | ||
| ... | ... | |
| #endif | ||
|     rb_define_module_function(rb_mProcess, "clock_gettime", rb_clock_gettime, -1); | ||
| #ifdef HAVE_MACH_ABSOLUTE_TIME | ||
|     rb_define_module_function(rb_mProcess, "mach_absolute_time", rb_mach_absolute_time, 0); | ||
|     rb_define_module_function(rb_mProcess, "absolute_to_ns", rb_absolute_to_ns, 1); | ||
|     mach_timebase_info(&sTimebaseInfo); | ||
| #endif | ||
| #if defined(HAVE_TIMES) || defined(_WIN32) | ||
|     rb_cProcessTms = rb_struct_define("Tms", "utime", "stime", "cutime", "cstime", NULL); | ||
| #endif | ||
| test/ruby/test_process.rb | ||
|---|---|---|
|     assert_raise(Errno::EINVAL) { Process.clock_gettime(:foo) } | ||
|   end | ||
|   def test_mach_absolute_time | ||
|     x = 3.times.map { Process.mach_absolute_time } | ||
|     x.each_cons(2) { |l,r| assert_operator(l, :<=, r) } | ||
|   end if Process.respond_to?(:mach_absolute_time) | ||
|   def test_absolute_to_ns | ||
|     x = 3.times.map { Process.mach_absolute_time } | ||
|     x.each_cons(2) { |l,r| | ||
|       assert_operator(Process.absolute_to_ns(r - l), :>, 0) | ||
|     } | ||
|   end if Process.respond_to?(:mach_absolute_time) | ||
| end | ||