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);
  
  
  

Reply via email to