Feature #10138 ยป time-s-monotonic.patch
time.c | ||
---|---|---|
#include "ruby/encoding.h"
|
||
#include "internal.h"
|
||
#ifdef OSX
|
||
#include <kern/clock.h>
|
||
#endif
|
||
#ifdef HAVE_UNISTD_H
|
||
#include <unistd.h>
|
||
#endif
|
||
... | ... | |
return time_utc_or_local(argc, argv, FALSE, klass);
|
||
}
|
||
/* call-seq:
|
||
* Time.monotonic
|
||
*
|
||
* Returns monotonic counter if available on system. Will throw exception
|
||
* if fails. Currently supports Windows (from 2000), OS/X and any *nix with
|
||
* clock_gettime. Time is returned in nanoseconds.
|
||
*
|
||
* Time.monotonic #=> 15898248961398385
|
||
*/
|
||
static VALUE
|
||
time_s_monotonic(VALUE klass) {
|
||
#ifdef WIN32
|
||
LARGE_INTEGER ts, freq;
|
||
QueryPerformanceFrequency(&freq);
|
||
QueryPerformanceCounter(&ts);
|
||
return INT64toNUM((ts.QuadPart * 1000000000LL) / freq.QuadPart);
|
||
#elif defined OSX
|
||
uint64_t abs,ts;
|
||
abs = mach_absolute_time();
|
||
absolutetime_to_nanoseconds(abs, &ts);
|
||
return INT64toNUM(ts);
|
||
#else
|
||
#ifdef HAVE_CLOCK_GETTIME
|
||
struct timespec ts;
|
||
#ifdef CLOCK_MONOTONIC_RAW
|
||
if (!clock_gettime(CLOCK_MONOTONIC_RAW, &ts))
|
||
return INT64toNUM(((long long unsigned) ts.tv_sec*1000000000) + (long long unsigned) ts.tv_nsec);
|
||
#elif defined CLOCK_MONOTONIC
|
||
if (!clock_gettime(CLOCK_MONOTONIC, &ts))
|
||
return INT64toNUM(((long long unsigned) ts.tv_sec*1000000000) + (long long unsigned) ts.tv_nsec);
|
||
rb_raise(rb_eRuntimeError, "clock_gettime() failed");
|
||
#endif
|
||
#endif
|
||
#endif
|
||
rb_raise(rb_eNotImpError, "No monotonic clock found");
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* time.to_i -> int
|
||
... | ... | |
rb_define_singleton_method(rb_cTime, "gm", time_s_mkutc, -1);
|
||
rb_define_singleton_method(rb_cTime, "local", time_s_mktime, -1);
|
||
rb_define_singleton_method(rb_cTime, "mktime", time_s_mktime, -1);
|
||
rb_define_singleton_method(rb_cTime, "monotonic", time_s_monotonic, -1);
|
||
rb_define_method(rb_cTime, "to_i", time_to_i, 0);
|
||
rb_define_method(rb_cTime, "to_f", time_to_f, 0);
|