summaryrefslogtreecommitdiff
path: root/thread_pthread.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-06-30 08:27:13 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-06-30 08:27:13 +0000
commitd49a61e68f1d6ffe448ec3244c63d48adc101cea (patch)
tree1119ba4d161d22df07295ead8a92a1fa09561117 /thread_pthread.c
parent0c22e9a001dde8bc662b003578ee63b01fcb0d6b (diff)
* 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
Diffstat (limited to 'thread_pthread.c')
-rw-r--r--thread_pthread.c14
1 files changed, 10 insertions, 4 deletions
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;