From 00512087777a60f77799263d6e9f77f1e47eb7a1 Mon Sep 17 00:00:00 2001 From: Robert James Kaes Date: Fri, 8 Dec 2000 03:35:07 +0000 Subject: Fixed a problem with polling for the number of active threads. No longer polls. :) --- src/thread.c | 64 +++++++++++++++++++++------------------------------------ src/tinyproxy.c | 8 ++++++-- 2 files changed, 29 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/thread.c b/src/thread.c index 6e5d0fb..e6fb390 100644 --- a/src/thread.c +++ b/src/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.1 2000-09-12 00:07:44 rjkaes Exp $ +/* $Id: thread.c,v 1.2 2000-12-08 03:35:07 rjkaes Exp $ * * Handles the creation/destruction of the various threads required for * processing incoming connections. @@ -39,7 +39,6 @@ struct thread_config_s { static unsigned int servers_waiting; /* servers waiting for a connection */ static pthread_mutex_t servers_mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t servers_cond = PTHREAD_COND_INITIALIZER; #define LOCK_SERVERS() pthread_mutex_lock(&servers_mutex) #define UNLOCK_SERVERS() pthread_mutex_unlock(&servers_mutex) @@ -155,50 +154,33 @@ int thread_pool_create(void) int thread_main_loop(void) { int i; - struct timeval tv; - struct timespec ts; - - while (config.quit == FALSE) { - /* Wait for one of the threads to signal */ - pthread_mutex_lock(&servers_mutex); - while (config.quit == FALSE - && servers_waiting < thread_config.maxspareservers - && servers_waiting > thread_config.minspareservers) { - if (gettimeofday(&tv, NULL) < 0) { - return -1; - } - ts.tv_sec = tv.tv_sec + 1; - ts.tv_nsec = tv.tv_usec * 1000; - pthread_cond_timedwait(&servers_cond, &servers_mutex, &ts); - } - if (config.quit == TRUE) - return 0; - - /* If there are not enough spare servers, create more */ - if (servers_waiting < thread_config.minspareservers) { - for (i = 0; i < thread_config.maxclients; i++) { - if (thread_ptr[i].status == T_EMPTY) { - pthread_create(&thread_ptr[i].tid, NULL, &thread_main, &thread_ptr[i]); - thread_ptr[i].status = T_WAITING; - servers_waiting++; - log(LOG_NOTICE, "Created a new thread."); - break; - } + /* If there are not enough spare servers, create more */ + LOCK_SERVERS(); + + if (servers_waiting < thread_config.minspareservers) { + for (i = 0; i < thread_config.maxclients; i++) { + if (thread_ptr[i].status == T_EMPTY) { + pthread_create(&thread_ptr[i].tid, NULL, &thread_main, &thread_ptr[i]); + thread_ptr[i].status = T_WAITING; + servers_waiting++; + log(LOG_NOTICE, "Created a new thread."); + break; } - } else if (servers_waiting > thread_config.maxspareservers) { - for (i = 0; i < thread_config.maxclients; i++) { - if (thread_ptr[i].status == T_WAITING) { - pthread_join(thread_ptr[i].tid, NULL); - servers_waiting--; - thread_ptr[i].status = T_EMPTY; - log(LOG_NOTICE, "Killed off a thread."); - break; - } + } + } else if (servers_waiting > thread_config.maxspareservers) { + for (i = 0; i < thread_config.maxclients; i++) { + if (thread_ptr[i].status == T_WAITING) { + pthread_join(thread_ptr[i].tid, NULL); + servers_waiting--; + thread_ptr[i].status = T_EMPTY; + log(LOG_NOTICE, "Killed off a thread."); + break; } } - pthread_mutex_unlock(&servers_mutex); } + + UNLOCK_SERVERS(); return 0; } diff --git a/src/tinyproxy.c b/src/tinyproxy.c index 30e5735..e0363d1 100644 --- a/src/tinyproxy.c +++ b/src/tinyproxy.c @@ -1,4 +1,4 @@ -/* $Id: tinyproxy.c,v 1.7 2000-11-23 04:46:48 rjkaes Exp $ +/* $Id: tinyproxy.c,v 1.8 2000-12-08 03:35:07 rjkaes Exp $ * * The initialise routine. Basically sets up all the initial stuff (logfile, * listening socket, config options, etc.) and then sits there and loops @@ -82,6 +82,7 @@ void takesig(int sig) log(LOG_INFO, "SIGTERM received."); break; } + if (sig != SIGTERM) signal(sig, takesig); signal(SIGPIPE, SIG_IGN); @@ -326,7 +327,10 @@ int main(int argc, char **argv) * Start the main loop. */ log(LOG_INFO, "Starting main loop. Accepting connections."); - thread_main_loop(); + do { + thread_main_loop(); + sleep(1); + } while (!config.quit); log(LOG_INFO, "Shutting down."); thread_close_sock(); -- cgit v1.2.3