manoj       99/03/22 12:38:04

  Modified:    pthreads/src/main http_main.c
  Log:
  
  
  Revision  Changes    Path
  1.66      +22 -12    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.65
  retrieving revision 1.66
  diff -u -u -r1.65 -r1.66
  --- http_main.c       1999/03/22 20:10:41     1.65
  +++ http_main.c       1999/03/22 20:38:03     1.66
  @@ -218,6 +218,10 @@
   /* The queue of sockets we've accepted */
   static FDQueue csd_queue;
   
  +/* Indicates that all acceptor threads are dead after SIGWINCH and the worker
  + * threads can now exit */
  +static int workers_may_exit = 0;
  +
   /* stuff that needs thread local store in main */
   typedef struct {
       jmp_buf thread_exit;
  @@ -417,7 +421,14 @@
   
   void kill_workers(void)
   {
  +    int i;
  +    int index = find_child_by_pid(getpid());
  +    parent_score *ss = &ap_scoreboard_image->parent[index];
  +
       pthread_cond_broadcast(&(csd_queue.not_empty));
  +    for (i = 0; i < ss->worker_threads; i++) {
  +     pthread_join(ap_scoreboard_image->servers[index][i].tid, NULL);
  +    }
   }
   
   /* Kill off any acceptor threads by kicking them out of what they are doing
  @@ -428,6 +439,11 @@
   void kill_acceptors(void)
   {
       listen_rec *lr;
  +    int i;
  +    int index = find_child_by_pid(getpid());
  +    parent_score *ss = &ap_scoreboard_image->parent[index];
  +
  +
       /* Kick acceptor threads out of accept */
       
       lr = ap_listeners;
  @@ -438,23 +454,18 @@
   
       /* Kick any acceptor out of blocking on a full queue */
       pthread_cond_broadcast(&(csd_queue.not_full));
  +
  +    for (i = ss->worker_threads; i < ss->worker_threads + 
ss->acceptor_threads; i++) {
  +     pthread_join(ap_scoreboard_image->servers[index][i].tid, NULL);
  +    }
   }    
   
   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(); 
  +    workers_may_exit = 1;
       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);
  -     }
  -    }
   }
   
   int ap_get_timeout(request_rec *r)
  @@ -1865,8 +1876,7 @@
       free(ti);
   
       ptrans = ap_make_sub_pool(pchild);
  -    while ((ap_max_requests_per_child != 0 && requests_this_child > 0) ||
  -           (ap_max_requests_per_child == 0)) { 
  +    while (!(workers_may_exit && (queue_size(&csd_queue) == 0))) {
           (void) ap_update_child_status(my_pid, my_tid, SERVER_READY, 
                                  (request_rec *) NULL);
            
  
  
  

Reply via email to