Project

General

Profile

Feature #8777 ยป mach_absolute.patch

tenderlovemaking (Aaron Patterson), 08/11/2013 06:23 PM

View differences:

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
    (1-1/1)