diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-06-30 08:27:13 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-06-30 08:27:13 +0000 |
commit | d49a61e68f1d6ffe448ec3244c63d48adc101cea (patch) | |
tree | 1119ba4d161d22df07295ead8a92a1fa09561117 | |
parent | 0c22e9a001dde8bc662b003578ee63b01fcb0d6b (diff) | |
download | ruby-d49a61e68f1d6ffe448ec3244c63d48adc101cea.tar.gz |
* thread_pthread.c (ping_signal_thread_list, thread_timer):
fix to keep polling state if there are any ping-tasks.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32322 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | thread_pthread.c | 14 |
2 files changed, 15 insertions, 4 deletions
@@ -1,3 +1,8 @@ +Thu Jun 30 17:25:08 2011 Koichi Sasada <ko1@atdot.net> + + * thread_pthread.c (ping_signal_thread_list, thread_timer): + fix to keep polling state if there are any ping-tasks. + Thu Jun 30 12:25:34 2011 Koichi Sasada <ko1@atdot.net> * thread_pthread.c (rb_thread_create_timer_thread): allocate diff --git a/thread_pthread.c b/thread_pthread.c index 9d8f833bbf..eeddd507eb 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -963,7 +963,7 @@ ubf_select(void *ptr) ubf_select_each(th); } -static void +static int ping_signal_thread_list(void) { if (signal_thread_list_anchor.next) { FGLOCK(&signal_thread_list_lock, { @@ -975,13 +975,17 @@ ping_signal_thread_list(void) { list = list->next; } }); + return 1; + } + else { + return 0; } } #else /* USE_SIGNAL_THREAD_LIST */ static void add_signal_thread_list(rb_thread_t *th) { } static void remove_signal_thread_list(rb_thread_t *th) { } #define ubf_select 0 -static void ping_signal_thread_list(void) { } +static int ping_signal_thread_list(void) { return 0; } #endif /* USE_SIGNAL_THREAD_LIST */ static pthread_t timer_thread_id; @@ -1069,17 +1073,19 @@ thread_timer(void *p) while (system_working > 0) { fd_set rfds; + int need_polling; /* timer function */ - ping_signal_thread_list(); + need_polling = ping_signal_thread_list(); timer_thread_function(0); + if (TT_DEBUG) WRITE_CONST(2, "tick\n"); /* wait */ FD_ZERO(&rfds); FD_SET(timer_thread_pipe[0], &rfds); - if (gvl->waiting > 0) { + if (gvl->waiting > 0 || need_polling) { timeout.tv_sec = 0; timeout.tv_usec = TIME_QUANTUM_USEC; |