manoj       99/04/29 12:34:23

  Modified:    .        STATUS
               pthreads/src/main http_accept.c http_main.c
  Log:
  Get rid of thread_starter_thread, and just start all of our worker
  threads from child_main. This makes the code simpler, and eliminates
  any race conditions involving trying to shutdown a child process while
  still starting threads.
  
  Revision  Changes    Path
  1.23      +1 -9      apache-apr/STATUS
  
  Index: STATUS
  ===================================================================
  RCS file: /home/cvs/apache-apr/STATUS,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -u -r1.22 -r1.23
  --- STATUS    1999/04/27 06:23:04     1.22
  +++ STATUS    1999/04/29 19:34:19     1.23
  @@ -1,5 +1,5 @@
   Apache Portable Runtime STATUS:
  -Last modified at [$Date: 1999/04/27 06:23:04 $]
  +Last modified at [$Date: 1999/04/29 19:34:19 $]
   
   Release:
   
  @@ -42,14 +42,6 @@
       Everything
   
   Needs patch:
  -
  -    On Red Hat 5.2, with a very low MaxRequestsPerChild (e.g. 10), when the
  -    server is banged on with ApacheBench, occasionally, the main thread of a
  -    process hangs around in pthread_exit_process. The size of that process is
  -    always around 11M. This bug is also exhibited by sending lots of SIGHUPs
  -    to the parent process rapidly (but not SIGWINCHes). The suspicion is that
  -    this is either an error in how pthread calls are used in the server, or a
  -    libc bug (the last refuge of a desperate programer).
   
       When the server runs at a high load, and the load later drops off,
       the server tries to kill off some children. The problem is that the
  
  
  
  1.11      +1 -12     apache-apr/pthreads/src/main/http_accept.c
  
  Index: http_accept.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/main/http_accept.c,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -u -r1.10 -r1.11
  --- http_accept.c     1999/04/22 05:46:53     1.10
  +++ http_accept.c     1999/04/29 19:34:20     1.11
  @@ -245,7 +245,7 @@
        */
       int i = ap_threads_per_child;
       if (lr) {
  -        while (lr->next != NULL) {
  +        while (lr != NULL) {
   
            (void) ap_update_child_status(my_child_num, i, SERVER_STARTING, 
                                          (request_rec *) NULL);
  @@ -277,17 +277,6 @@
         /* no listening sockets????  Kill the server please.  */
         exit(0);
       }
  -    (void) ap_update_child_status(my_child_num, i, SERVER_STARTING, 
  -                               (request_rec *) NULL);
  -
  -    my_info = NULL;
  -
  -    my_info = (proc_info *) malloc(sizeof(proc_info));
  -    my_info->pid = my_child_num;
  -    my_info->tid = i;
  -    my_info->sd = lr->fd;
  -
  -    accept_thread(my_info);
   }
   
   int get_connection(struct sockaddr *sa_client)
  
  
  
  1.78      +31 -52    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.77
  retrieving revision 1.78
  diff -u -u -r1.77 -r1.78
  --- http_main.c       1999/04/22 04:14:40     1.77
  +++ http_main.c       1999/04/29 19:34:21     1.78
  @@ -1884,61 +1884,16 @@
   #endif /* ndef WIN32 */
   }
   
  -static void *thread_starter_thread(void *thread_arg) {
  -    int i;
  -    pthread_t thread;
  -    int my_child_num = *((int *) thread_arg);
  -    proc_info *my_info = NULL;
  -
  -    /* Setup worker threads */
  -    for (i=0; i < ap_threads_per_child; i++) {
  -
  -        my_info = NULL;
  -     
  -     my_info = (proc_info *)malloc(sizeof(proc_info));
  -     my_info->pid = my_child_num;
  -        my_info->tid = i;
  -     my_info->sd = 0;
  -     
  -     /* We are creating threads right now */
  -     (void) ap_update_child_status(my_child_num, i, SERVER_STARTING, 
  -                                   (request_rec *) NULL);
  -     if (pthread_create(&thread, NULL, worker_thread, my_info)) {
  -         ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf,
  -                      "pthread_create: unable to create worker thread");
  -         /* 
  -          * We failed to create a thread.  Update the scoreboard,  
  -          * or it will say SERVER_STARTING forever.
  -          */
  -         (void) ap_update_child_status(my_child_num, i, SERVER_DEAD, 
  -                                       (request_rec *) NULL);
  -         exit(1);   /* We won't always exit here, but for no this is okay */
  -     }
  -
  -     /* We let each thread update it's own scoreboard entry.  This is done
  -      * because it let's us deal with tid better.
  -      */
  -    }
  -    
  -
  -    /* Begin accepting requests 
  -     *  Design:
  -     *  
  -     */
  -    start_accepting_connections(my_child_num);
  -    return NULL;
  -}
  -
   static void child_main(int child_num_arg)
   {
       sigset_t sig_mask;
       int signal_received;
       pthread_t thread;
  -    int j;
  +    int i, j;
  +    int my_child_num = child_num_arg;
  +    proc_info *my_info = NULL;
   
       my_pid = getpid();
  -
  -
       pchild = ap_make_sub_pool(pconf);
   
       /*stuff to do before we switch id's, so we have permissions.*/
  @@ -1965,13 +1920,37 @@
           ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf, 
"pthread_sigmask");
       }
   
  +    /* Setup worker threads */
  +    for (i=0; i < ap_threads_per_child; i++) {
   
  +        my_info = NULL;
  +     
  +     my_info = (proc_info *)malloc(sizeof(proc_info));
  +     my_info->pid = my_child_num;
  +        my_info->tid = i;
  +     my_info->sd = 0;
  +     
  +     /* We are creating threads right now */
  +     (void) ap_update_child_status(my_child_num, i, SERVER_STARTING, 
  +                                   (request_rec *) NULL);
  +     if (pthread_create(&thread, NULL, worker_thread, my_info)) {
  +         ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf,
  +                      "pthread_create: unable to create worker thread");
  +         /* 
  +          * We failed to create a thread.  Update the scoreboard,  
  +          * or it will say SERVER_STARTING forever.
  +          */
  +         (void) ap_update_child_status(my_child_num, i, SERVER_DEAD, 
  +                                       (request_rec *) NULL);
  +         exit(1);   /* We won't always exit here, but for no this is okay */
  +     }
   
  -    if (pthread_create(&thread, NULL, thread_starter_thread, 
&child_num_arg)) {
  -        ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf,
  -              "pthread_create: unable to create thread starter thread");
  -        clean_child_exit(1);
  +     /* We let each thread update it's own scoreboard entry.  This is done
  +      * because it let's us deal with tid better.
  +      */
       }
  +
  +    start_accepting_connections(my_child_num);
   
       /* This thread will be the one responsible for handling signals */
       sigemptyset(&sig_mask);
  
  
  

Reply via email to