rbb         99/02/18 10:06:51

  Modified:    pthreads/src/main http_main.c
  Log:
  Logic for single thread signal handler.
  Submitted by:  Manoj Kasichainula
  
  Revision  Changes    Path
  1.46      +78 -59    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.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- http_main.c       1999/02/18 05:43:51     1.45
  +++ http_main.c       1999/02/18 18:06:49     1.46
  @@ -176,7 +176,6 @@
   int ap_listenbacklog;
   int ap_dump_settings = 0;
   int exiting_now = 0;
  -pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
   API_VAR_EXPORT int ap_extended_status = 0;
   
   
  @@ -2287,17 +2286,7 @@
         }
       }
       ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) 
NULL);
  -    pthread_mutex_lock(&exit_mutex);
  -    if (exiting_now == 0) {
  -     exiting_now++;
  -     pthread_mutex_unlock(&exit_mutex); 
  -        graceful_killer();
  -        clean_child_exit(0);
  -    }
  -    else {
  -        pthread_mutex_unlock(&exit_mutex);
  -    }
  -    pthread_exit(NULL);
  +    return NULL;
   }
   
   void * worker_thread(void * dummy)
  @@ -2325,17 +2314,7 @@
       }
       ap_destroy_pool(ptrans);
       ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *) 
NULL);
  -    pthread_mutex_lock(&exit_mutex);
  -    if (exiting_now == 0) {
  -     exiting_now++;
  -     pthread_mutex_unlock(&exit_mutex); 
  -        graceful_killer();
  -        clean_child_exit(0);
  -    }
  -    else {
  -        pthread_mutex_unlock(&exit_mutex);
  -    }
  -    pthread_exit(NULL);
  +    return NULL;
   }
   
   /*****************************************************************
  @@ -2461,39 +2440,14 @@
   #endif /* ndef WIN32 */
   }
   
  -static void child_main(int child_num_arg)
  -{
  +static void *thread_starter_thread(void *thread_arg) {
       listen_rec *lr;
       int i, curr;
       pthread_t thread;
  -    int my_child_num = child_num_arg;
  +    int my_child_num = *((int *) thread_arg);
       proc_info *my_info = NULL;
       sigset_t sig_mask;
  -    int ret;
  -
  -    my_pid = getpid();
  -    requests_this_child = ap_max_requests_per_child;
  -
  -    pchild = ap_make_sub_pool(pconf);
  -
  -    /*stuff to do before we switch id's, so we have permissions.*/
  -    reopen_scoreboard(pchild);
  -    SAFE_ACCEPT(accept_mutex_child_init(pchild));
  -
  -    set_group_privs();
   
  -    if (!geteuid() && (setuid(ap_user_id) == -1)) {
  -        ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf,
  -                  "setuid: unable to change uid");
  -     clean_child_exit(APEXIT_CHILDFATAL);
  -    }
  -
  -    ap_child_init_modules(pchild, server_conf);
  -
  -    /*done with init critical section */
  -
  -    queue_init(&csd_queue, ap_threads_per_child, pchild);
  -
       /* Setup worker threads */
       for (i=0; i < ap_threads_per_child; i++) {
           my_info = NULL;
  @@ -2559,14 +2513,6 @@
         /* no listening sockets????  Kill the server please.  */
         exit(0);
       }
  -#if 0
  -    /* This thread will be the one responsible for handling signals */
  -    sigfillset(&sig_mask);
  -    if ((ret = pthread_sigmask(SIG_SETMASK, &sig_mask, NULL)) != 0) {
  -        ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf, "pthread_sigmask 
failed");
  -    }
  -#endif
  -
       (void) ap_update_child_status(my_child_num, i, SERVER_STARTING, 
                                  (request_rec *) NULL);
   
  @@ -2581,6 +2527,77 @@
       accept_thread(my_info);
   }
   
  +static void child_main(int child_num_arg)
  +{
  +    sigset_t sig_mask;
  +    int signal_received;
  +    pthread_t thread;
  +
  +    my_pid = getpid();
  +    requests_this_child = ap_max_requests_per_child;
  +
  +    pchild = ap_make_sub_pool(pconf);
  +
  +    /*stuff to do before we switch id's, so we have permissions.*/
  +    reopen_scoreboard(pchild);
  +    SAFE_ACCEPT(accept_mutex_child_init(pchild));
  +
  +    set_group_privs();
  +
  +    if (!geteuid() && (setuid(ap_user_id) == -1)) {
  +        ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf,
  +                  "setuid: unable to change uid");
  +     clean_child_exit(APEXIT_CHILDFATAL);
  +    }
  +
  +    ap_child_init_modules(pchild, server_conf);
  +
  +    /*done with init critical section */
  +
  +    /* All threads should mask signals out, accoring to sigwait(2) man page 
*/
  +    sigemptyset(&sig_mask);
  +    /* Linux 2.0 and its annoying use of SIGUSR{1,2} */
  +#ifdef LINUX
  +    /*
  +    sigaddset(&sig_mask, SIGUSR1);
  +    sigaddset(&sig_mask, SIGUSR2);
  +    */
  +#endif
  +
  +    if (pthread_sigmask(SIG_SETMASK, &sig_mask, NULL) != 0) {
  +        ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf, 
"pthread_sigmask");
  +    }
  +
  +    queue_init(&csd_queue, ap_threads_per_child, pchild);
  +
  +    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);
  +    }
  +
  +    /* This thread will be the one responsible for handling signals */
  +    sigemptyset(&sig_mask);
  +    sigaddset(&sig_mask, SIGWINCH);
  +    sigaddset(&sig_mask, SIGTERM);
  +    sigwait(&sig_mask, &signal_received);
  +    /* XXX - Do the appropriate thing for each signal */
  +    switch (signal_received) {
  +        case SIGWINCH:
  +                 graceful_sig_handler(SIGWINCH);
  +            graceful_killer();
  +            clean_child_exit(0);
  +         break;
  +        case SIGTERM:
  +            just_die(SIGTERM);
  +         break;
  +        default:
  +            ap_log_error(APLOG_MARK, APLOG_ALERT, server_conf,
  +        "received strange signal: %d", signal_received);
  +
  +    }
  +}
  +
   static int make_child(server_rec *s, int slot, time_t now) /* ZZZ */
   {
       pthread_t tid;   /* ZZZZ */
  @@ -2638,9 +2655,11 @@
           RAISE_SIGSTOP(MAKE_CHILD);
           MONCONTROL(1);
   
  +     /*
           signal(SIGWINCH, graceful_sig_handler);
           signal(SIGTERM, just_die);
  -     child_main(slot);
  +     */
  +        child_main(slot);
   
        return 0;
       }
  
  
  

Reply via email to