diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-03-11 15:51:44 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-03-11 15:51:44 +0000 |
commit | c98f39af775058dfc39e9f14fb0557e887efbba5 (patch) | |
tree | 2cd8ec59a5831e5eb3dae91b5143c84803bdb9fd /thread_pthread.c | |
parent | 735f7a510e2a15d3046d7e835cde2c8f3b658848 (diff) |
merge revision(s) 39680,39681: [Backport #8063]
* thread_pthread.c (USE_SLEEPY_TIMER_THREAD): use more accurate
ifdef condtions.
* thread_pthread.c (timer_thread_sleep): use poll() instead of
select(). select doesn't work if timer_thread_pipe[0] is
greater than FD_SETSIZE.
* thread_pthread.c (USE_SLEEPY_TIMER_THREAD): add a dependency
against poll.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@39726 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread_pthread.c')
-rw-r--r-- | thread_pthread.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/thread_pthread.c b/thread_pthread.c index 6e5f53fa67..7adc229c42 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -30,6 +30,9 @@ #if defined(__native_client__) && defined(NACL_NEWLIB) # include "nacl/select.h" #endif +#if HAVE_POLL +#include <poll.h> +#endif static void native_mutex_lock(pthread_mutex_t *lock); static void native_mutex_unlock(pthread_mutex_t *lock); @@ -53,12 +56,11 @@ static pthread_t timer_thread_id; #define USE_MONOTONIC_COND 0 #endif -#ifdef __native_client__ -/* Doesn't have select(1). */ -# define USE_SLEEPY_TIMER_THREAD 0 -#else +#if defined(HAVE_POLL) && defined(HAVE_FCNTL) && defined(F_GETFL) && defined(F_SETFL) && defined(O_NONBLOCK) && !defined(__native_client__) /* The timer thread sleeps while only one Ruby thread is running. */ # define USE_SLEEPY_TIMER_THREAD 1 +#else +# define USE_SLEEPY_TIMER_THREAD 0 #endif static void @@ -1218,23 +1220,20 @@ timer_thread_sleep(rb_global_vm_lock_t* gvl) { int result; int need_polling; - struct timeval timeout; - fd_set rfds; - FD_ZERO(&rfds); - FD_SET(timer_thread_pipe[0], &rfds); + struct pollfd pollfd; + + pollfd.fd = timer_thread_pipe[0]; + pollfd.events = POLLIN; need_polling = check_signal_thread_list(); if (gvl->waiting > 0 || need_polling) { - timeout.tv_sec = 0; - timeout.tv_usec = TIME_QUANTUM_USEC; - /* polling (TIME_QUANTUM_USEC usec) */ - result = select(timer_thread_pipe[0] + 1, &rfds, 0, 0, &timeout); + result = poll(&pollfd, 1, TIME_QUANTUM_USEC/1000); } else { /* wait (infinite) */ - result = select(timer_thread_pipe[0] + 1, &rfds, 0, 0, 0); + result = poll(&pollfd, 1, -1); } if (result == 0) { |