diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | thread_pthread.c | 25 |
2 files changed, 28 insertions, 3 deletions
@@ -1,3 +1,9 @@ +Sat May 7 01:54:21 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> + + * thread_pthread.c (get_ts): add monotonic clock capability. + * thread_pthread.c (rb_thread_create_timer_thread): use monotonic + clock if possible. + Sat May 7 01:43:37 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> * thread_pthread.h (rb_thread_cond_t): add clockid field. it's diff --git a/thread_pthread.c b/thread_pthread.c index 4cb16544f5..7d55ba2763 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -920,10 +920,29 @@ static pthread_mutex_t timer_thread_lock = PTHREAD_MUTEX_INITIALIZER; static struct timespec * get_ts(struct timespec *ts, unsigned long nsec) { + int ret; struct timeval tv; - gettimeofday(&tv, 0); + +#if USE_MONOTONIC_COND + if (timer_thread_cond.clockid == CLOCK_MONOTONIC) { + ret = clock_gettime(CLOCK_MONOTONIC, ts); + if (ret != 0) + rb_sys_fail("clock_gettime(CLOCK_MONOTONIC)"); + goto out; + } +#endif + + if (timer_thread_cond.clockid != CLOCK_REALTIME) + rb_bug("unsupported clockid %d", timer_thread_cond.clockid); + + ret = gettimeofday(&tv, 0); + if (ret != 0) + rb_sys_fail(0); ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000 + nsec; + ts->tv_nsec = tv.tv_usec * 1000; + + out: + ts->tv_nsec += nsec; if (ts->tv_nsec >= PER_NANO) { ts->tv_sec++; ts->tv_nsec -= PER_NANO; @@ -975,7 +994,7 @@ rb_thread_create_timer_thread(void) int err; pthread_attr_init(&attr); - native_cond_initialize(&timer_thread_cond, 0); + native_cond_initialize(&timer_thread_cond, RB_CONDATTR_CLOCK_MONOTONIC); #ifdef PTHREAD_STACK_MIN pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + (THREAD_DEBUG ? BUFSIZ : 0)); |