rbb 99/03/22 12:10:42
Modified: pthreads/src/main http_main.c Log: Small abstraction patch. This also closes a small hole. We want to kill accept threads before we kill worker threads. Revision Changes Path 1.65 +29 -8 apache-apr/pthreads/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v retrieving revision 1.64 retrieving revision 1.65 diff -u -r1.64 -r1.65 --- http_main.c 1999/03/21 10:51:43 1.64 +++ http_main.c 1999/03/22 20:10:41 1.65 @@ -409,15 +409,25 @@ exit(code); } -void graceful_killer(void) -{ - listen_rec *lr; - int i; - int index = find_child_by_pid(getpid()); - parent_score *ss = &ap_scoreboard_image->parent[index]; +/* Kill off any worker threads by kicking them out of whatever they are doing + * and allowing them to see that requests_this_child == 0. + * It is possible this function could be defined to be NULL in some accept + * models. + */ +void kill_workers(void) +{ pthread_cond_broadcast(&(csd_queue.not_empty)); - +} + +/* Kill off any acceptor threads by kicking them out of what they are doing + * and allowing them to see that requests_this_child == 0. + * It is possible this function could be defined to be NULL in some accept + * models. + */ +void kill_acceptors(void) +{ + listen_rec *lr; /* Kick acceptor threads out of accept */ lr = ap_listeners; @@ -428,7 +438,18 @@ /* Kick any acceptor out of blocking on a full queue */ pthread_cond_broadcast(&(csd_queue.not_full)); - +} + +void graceful_killer(void) +{ + int i; + int index = find_child_by_pid(getpid()); + parent_score *ss = &ap_scoreboard_image->parent[index]; + + /* The two functions to get all of our other threads to die off. */ + kill_acceptors(); + kill_workers(); + for (i = 0; i < ss->worker_threads + ss->acceptor_threads; i++) { if (ap_scoreboard_image->servers[index][i].status != SERVER_DEAD) { pthread_join(ap_scoreboard_image->servers[index][i].tid, NULL);