From 00512087777a60f77799263d6e9f77f1e47eb7a1 Mon Sep 17 00:00:00 2001
From: Robert James Kaes <rjkaes@users.sourceforge.net>
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(-)

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