diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/thread.c | 24 | ||||
-rw-r--r-- | src/thread.h | 3 | ||||
-rw-r--r-- | src/tinyproxy.c | 4 |
3 files changed, 28 insertions, 3 deletions
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(); /* |