manoj       99/02/16 21:32:02

  Modified:    pthreads/src/main http_main.c
  Log:
  pthread calls while handling a signal are baaaaad voodoo. This is another way
  to allow cleanups to run after all threads exit.
  
  Revision  Changes    Path
  1.37      +11 -10    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.36
  retrieving revision 1.37
  diff -u -u -r1.36 -r1.37
  --- http_main.c       1999/02/17 00:03:41     1.36
  +++ http_main.c       1999/02/17 05:32:00     1.37
  @@ -431,13 +431,6 @@
        ap_pclosesocket(pconf, lr->fd);
        lr= lr->next;
       }
  -    
  -    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);
  -     }
  -    }
  -    clean_child_exit(0);
   }
   
   /******  ZZZ this should probably be abstracted to it's own file.   ****/
  @@ -2300,7 +2293,7 @@
       }
       ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) 
NULL);
       pthread_once(&firstcall, graceful_killer);
  -    pthread_exit(NULL);
  +    return NULL;
   }
   
   void * worker_thread(void * dummy)
  @@ -2328,8 +2321,7 @@
       ap_destroy_pool(ptrans);
       ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) 
NULL);
       pthread_once(&firstcall, graceful_killer);
  -
  -    pthread_exit(NULL);
  +    return NULL;
   }
   
   /*****************************************************************
  @@ -2573,6 +2565,15 @@
       lr->used = 1;
       
       accept_thread(my_info);
  +    
  +    /* Wait for other threads to die, then clean up. Note: joining oneself is
  +     * a bad thing, so we make sure that i < my_info->tid, not <= */
  +    for (i = 0; i < my_info->tid; i++) {
  +        if (ap_scoreboard_image->servers[my_child_num][i].status != 
SERVER_DEAD) {
  +         pthread_join(ap_scoreboard_image->servers[my_child_num][i].tid, 
NULL);
  +     }
  +    }
  +    clean_child_exit(0);
   }
   
   static int make_child(server_rec *s, int slot, time_t now) /* ZZZ */
  
  
  

Reply via email to