1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* time.c (rb_timespec_now): added.

* time.c (rb_time_timespec_new): added.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2015-11-10 02:59:47 +00:00
parent 1ed3287af1
commit f1df08e76d
4 changed files with 62 additions and 14 deletions

View file

@ -1,3 +1,9 @@
Tue Nov 10 11:25:29 2015 NARUSE, Yui <naruse@ruby-lang.org>
* time.c (rb_timespec_now): added.
* time.c (rb_time_timespec_new): added.
Tue Nov 10 06:17:17 2015 Eric Wong <e@80x24.org> Tue Nov 10 06:17:17 2015 Eric Wong <e@80x24.org>
* variable.c (rb_autoload_load): allow recursive calls * variable.c (rb_autoload_load): allow recursive calls

5
NEWS
View file

@ -209,6 +209,11 @@ with all sufficient information, see the ChangeLog file.
class is already defined but its superclass does not match the given class is already defined but its superclass does not match the given
superclass, as well as definitions in ruby level. superclass, as well as definitions in ruby level.
* rb_timespec_now() is added to fetch current datetime as struct timespec.
* rb_time_timespec_new() is added to create a time object with epoch,
nanosecond, and UTC/localtime/time offset arguments.
=== Build system updates === Build system updates
=== Implementation changes === Implementation changes

View file

@ -919,8 +919,10 @@ VALUE rb_mutex_unlock(VALUE mutex);
VALUE rb_mutex_sleep(VALUE self, VALUE timeout); VALUE rb_mutex_sleep(VALUE self, VALUE timeout);
VALUE rb_mutex_synchronize(VALUE mutex, VALUE (*func)(VALUE arg), VALUE arg); VALUE rb_mutex_synchronize(VALUE mutex, VALUE (*func)(VALUE arg), VALUE arg);
/* time.c */ /* time.c */
void rb_timespec_now(struct timespec *);
VALUE rb_time_new(time_t, long); VALUE rb_time_new(time_t, long);
VALUE rb_time_nano_new(time_t, long); VALUE rb_time_nano_new(time_t, long);
VALUE rb_time_timespec_new(const struct timespec *, int);
VALUE rb_time_num_new(VALUE, VALUE); VALUE rb_time_num_new(VALUE, VALUE);
struct timeval rb_time_interval(VALUE num); struct timeval rb_time_interval(VALUE num);
struct timeval rb_time_timeval(VALUE time); struct timeval rb_time_timeval(VALUE time);

63
time.c
View file

@ -1892,6 +1892,25 @@ timew2timespec_exact(wideval_t timew, struct timespec *ts)
return ts; return ts;
} }
void
rb_timespec_now(struct timespec *ts)
{
#ifdef HAVE_CLOCK_GETTIME
if (clock_gettime(CLOCK_REALTIME, ts) == -1) {
rb_sys_fail("clock_gettime");
}
#else
{
struct timeval tv;
if (gettimeofday(&tv, 0) < 0) {
rb_sys_fail("gettimeofday");
}
ts->tv_sec = tv.tv_sec;
ts->tv_nsec = tv.tv_usec * 1000;
}
#endif
}
static VALUE static VALUE
time_init_0(VALUE time) time_init_0(VALUE time)
{ {
@ -1903,20 +1922,7 @@ time_init_0(VALUE time)
tobj->gmt = 0; tobj->gmt = 0;
tobj->tm_got=0; tobj->tm_got=0;
tobj->timew = WINT2FIXWV(0); tobj->timew = WINT2FIXWV(0);
#ifdef HAVE_CLOCK_GETTIME rb_timespec_now(&ts);
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
rb_sys_fail("clock_gettime");
}
#else
{
struct timeval tv;
if (gettimeofday(&tv, 0) < 0) {
rb_sys_fail("gettimeofday");
}
ts.tv_sec = tv.tv_sec;
ts.tv_nsec = tv.tv_usec * 1000;
}
#endif
tobj->timew = timespec2timew(&ts); tobj->timew = timespec2timew(&ts);
return time; return time;
@ -2299,12 +2305,41 @@ rb_time_new(time_t sec, long usec)
return time_new_timew(rb_cTime, timew); return time_new_timew(rb_cTime, timew);
} }
/* returns localtime time object */
VALUE VALUE
rb_time_nano_new(time_t sec, long nsec) rb_time_nano_new(time_t sec, long nsec)
{ {
return time_new_timew(rb_cTime, nsec2timew(sec, nsec)); return time_new_timew(rb_cTime, nsec2timew(sec, nsec));
} }
/**
* Returns a time object with UTC/localtime/fixed offset
*
* offset is -86400 < fixoff < 86400 or INT_MAX (UTC) or INT_MAX-1 (localtime)
*/
VALUE
rb_time_timespec_new(const struct timespec *ts, int offset)
{
struct time_object *tobj;
VALUE time = time_new_timew(rb_cTime, nsec2timew(ts->tv_sec, ts->tv_nsec));
if (-86400 < offset && offset < 86400) { /* fixoff */
GetTimeval(time, tobj);
TIME_SET_FIXOFF(tobj, INT2FIX(offset));
}
else if (offset == INT_MAX) { /* UTC */
GetTimeval(time, tobj);
TIME_SET_UTC(tobj);
}
else if (offset == INT_MAX-1) { /* localtime */
}
else {
rb_raise(rb_eArgError, "utc_offset out of range");
}
return time;
}
VALUE VALUE
rb_time_num_new(VALUE timev, VALUE off) rb_time_num_new(VALUE timev, VALUE off)
{ {