rbb         99/02/16 10:31:58

  Modified:    pthreads/src/main http_main.c
  Log:
  Code to properly finish a child process.  This makes sure the child process
  calls the proper module functions, and sets the scoreboard to SERVER_DEAD
  for all threads.
  Submitted by:  Manoj Kasichainula and Ryan Bloom
  
  Revision  Changes    Path
  1.32      +32 -25    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.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- http_main.c       1999/02/16 16:00:48     1.31
  +++ http_main.c       1999/02/16 18:31:53     1.32
  @@ -380,23 +380,6 @@
       }
   }
   
  -void graceful_killer(void)
  -{
  -    listen_rec *lr;
  -    int i;
  -
  -    for (i = 0; i < ap_threads_per_child; i++) {
  -        pthread_cond_signal(&(csd_queue.not_empty));
  -    }
  -    /* Setup acceptor threads */
  -    
  -    lr = ap_listeners;
  -    while (lr->next != NULL) {
  -     ap_pclosesocket(pconf, lr->fd);
  -     lr= lr->next;
  -    }
  -}
  -
   /* a clean exit from the parent with proper cleanup */
   static void clean_parent_exit(int code) __attribute__((noreturn));
   static void clean_parent_exit(int code)
  @@ -413,6 +396,7 @@
       int child_num = find_child_by_pid(getpid());
       int i;
       listen_rec *lr;
  +    parent_score *ss = &ap_scoreboard_image->parent[child_num];
   
       for (i = 0; i < ap_threads_per_child + ap_acceptors_per_child; i++)
           ap_update_child_status(child_num, i, SERVER_DEAD, (request_rec *) 
NULL);
  @@ -422,9 +406,40 @@
        ap_destroy_pool(pchild);
       }
   
  +    for (i = 0; i < ss->worker_threads + ss->acceptor_threads; i++) {
  +        if (ap_scoreboard_image->servers[child_num][i].status != 
SERVER_DEAD) {
  +         pthread_cancel(ap_scoreboard_image->servers[child_num][i].tid);
  +     }
  +    }
  +
       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];
  +
  +    for (i = 0; i < ap_threads_per_child; i++) {
  +        pthread_cond_signal(&(csd_queue.not_empty));
  +    }
  +    /* Setup acceptor threads */
  +    
  +    lr = ap_listeners;
  +    while (lr->next != NULL) {
  +     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.   ****/
   
  @@ -2451,15 +2466,12 @@
       proc_info *my_info = NULL;
       sigset_t sig_mask;
       int ret;
  -    pthread_attr_t thread_attr;
   
       my_pid = getpid();
       requests_this_child = ap_max_requests_per_child;
   
       pchild = ap_make_sub_pool(pconf);
   
  -    pthread_detach(pthread_self());
  -
       /*stuff to do before we switch id's, so we have permissions.*/
       reopen_scoreboard(pchild);
       SAFE_ACCEPT(accept_mutex_child_init(pchild));
  @@ -2477,11 +2489,6 @@
       /*done with init critical section */
   
       queue_init(&csd_queue, ap_threads_per_child, pchild);
  -
  -    pthread_attr_init(&thread_attr);
  -
  -    /* We don't want to have to pthread_wait on these threads */
  -    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
   
       /* Setup worker threads */
       for (i=0; i < ap_threads_per_child; i++) {
  
  
  

Reply via email to