summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert James Kaes <rjkaes@users.sourceforge.net>2002-01-25 00:01:45 +0000
committerRobert James Kaes <rjkaes@users.sourceforge.net>2002-01-25 00:01:45 +0000
commit1819c0f818b281a57ac6fddcaae3dbbf615a2da1 (patch)
tree92ae4102bc15073e6e3ebe9dfdf09b8b5b6032d7
parent388920bc53a01d983cd438d8ee1f1518f92097ce (diff)
downloadtinyproxy-1819c0f818b281a57ac6fddcaae3dbbf615a2da1.tar.gz
tinyproxy-1819c0f818b281a57ac6fddcaae3dbbf615a2da1.zip
Added code to check for "errors" from the accept call in thread_main() and
also a new thread_kill_threads() function which should cancel all threads when the main thread is being closed.
-rw-r--r--ChangeLog5
-rw-r--r--src/thread.c24
-rw-r--r--src/thread.h3
-rw-r--r--src/tinyproxy.c4
4 files changed, 33 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f97d40..8239b38 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2002-01-13 Robert James Kaes <rjkaes@flarenet.com>
+
+ * src/thread.c (thread_kill_threads): Added a function to
+ explictly go through all the active threads and kill them.
+
2002-01-07 Robert James Kaes <rjkaes@flarenet.com>
* src/thread.c (thread_main): Added code to check if tinyproxy is
diff --git a/src/thread.c b/src/thread.c
index 4afd0af..5b64caa 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -1,4 +1,4 @@
-/* $Id: thread.c,v 1.20 2002-01-08 02:02:25 rjkaes Exp $
+/* $Id: thread.c,v 1.21 2002-01-25 00:01:45 rjkaes Exp $
*
* Handles the creation/destruction of the various threads required for
* processing incoming connections.
@@ -144,6 +144,14 @@ thread_main(void *arg)
* Make sure no error occurred...
*/
if (connfd < 0) {
+ /*
+ * Accept could return an "error" if it was
+ * interrupted by a signal (like when the program
+ * should be killed. :)
+ */
+ if (config.quit)
+ break;
+
log_message(LOG_ERR, "Accept returned an error (%s) ... retrying.", strerror(errno));
continue;
}
@@ -288,6 +296,20 @@ thread_main_loop(void)
SERVER_UNLOCK();
}
+/*
+ * Go through all the non-empty threads and cancel them.
+ */
+void
+thread_kill_threads(void)
+{
+ int i;
+
+ for (i = 0; i < thread_config.maxclients; i++) {
+ if (thread_ptr[i].status != T_EMPTY)
+ pthread_cancel(thread_ptr[i].tid);
+ }
+}
+
int
thread_listening_sock(uint16_t port)
{
diff --git a/src/thread.h b/src/thread.h
index 2c6b771..aed3570 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -1,4 +1,4 @@
-/* $Id: thread.h,v 1.3 2001-09-07 04:20:04 rjkaes Exp $
+/* $Id: thread.h,v 1.4 2002-01-25 00:01:45 rjkaes Exp $
*
* See 'thread.c' for more information.
*
@@ -30,6 +30,7 @@ extern short int thread_pool_create(void);
extern int thread_listening_sock(uint16_t port);
extern void thread_close_sock(void);
extern void thread_main_loop(void);
+extern void thread_kill_threads(void);
extern short int thread_configure(thread_config_t type, unsigned int val);
diff --git a/src/tinyproxy.c b/src/tinyproxy.c
index f5edb56..6e050c2 100644
--- a/src/tinyproxy.c
+++ b/src/tinyproxy.c
@@ -1,4 +1,4 @@
-/* $Id: tinyproxy.c,v 1.21 2001-12-23 22:00:36 rjkaes Exp $
+/* $Id: tinyproxy.c,v 1.22 2002-01-25 00:01:45 rjkaes Exp $
*
* The initialise routine. Basically sets up all the initial stuff (logfile,
* listening socket, config options, etc.) and then sits there and loops
@@ -432,6 +432,8 @@ main(int argc, char **argv)
} while (!config.quit);
log_message(LOG_INFO, "Shutting down.");
+
+ thread_kill_threads();
thread_close_sock();
/*