manoj       99/04/14 15:44:58

  Modified:    pthreads/src/include acceptlock.h http_accept.h
               pthreads/src/main acceptlock.c http_accept.c http_main.c
  Log:
  Cleanup and bug fixes. This patch removes the link between
  ap_acceptors_per_child and the number of listen fds, to support the new
  poll-accept model. As a result, we don't create a bunch of accept
  mutexes we don't need, and there isn't a pile of phantom threads that
  we attempt to count and operate on.
  
  Revision  Changes    Path
  1.3       +7 -7      apache-apr/pthreads/src/include/acceptlock.h
  
  Index: acceptlock.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/include/acceptlock.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -u -r1.2 -r1.3
  --- acceptlock.h      1999/03/07 00:47:43     1.2
  +++ acceptlock.h      1999/04/14 22:44:55     1.3
  @@ -65,7 +65,7 @@
   /* Prototyps for the accept mutex functions. */
   #if defined (USE_USLOCK_SERIALIZED_ACCEPT)
   #define accept_mutex_child_init(x)
  -void accept_mutex_init(pool *);
  +void accept_mutex_init(pool *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
  @@ -73,33 +73,33 @@
   void accept_mutex_child_cleanup(void *);
   void accept_mutex_child_init(pool *);
   void accept_mutex_cleanup(void *);
  -void accept_mutex_init(pool *);
  +void accept_mutex_init(pool *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
   #elif defined (USE_SYSVSEM_SERIALIZED_ACCEPT)
   void accept_mutex_cleanup(void *);
  -void accept_mutex_init(pool *);
  +void accept_mutex_init(pool *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
   #elif defined(USE_FCNTL_SERIALIZED_ACCEPT)
   #define accept_mutex_child_init(x)
  -void accept_mutex_init(pool *);
  +void accept_mutex_init(pool *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
   #elif defined(USE_FLOCK_SERIALIZED_ACCEPT)
   void accept_mutex_cleanup(void *);
   void accept_mutex_child_init(pool *);
  -void accept_mutex_init(pool *);
  +void accept_mutex_init(pool *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
   #elif defined(USE_OS2SEM_SERIALIZED_ACCEPT)
   void accept_mutex_cleanup(void *);
   void accept_mutex_child_init(pool *);
  -void accept_mutex_init(pool *);
  +void accept_mutex_init(pool *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
  @@ -109,7 +109,7 @@
    * the sockets. */
   #define NO_SERIALIZED_ACCEPT
   #define accept_mutex_child_init(x)
  -#define accept_mutex_init(x)
  +#define accept_mutex_init(x, y)
   #define accept_mutex_on(x)
   #define accept_mutex_off(x)
   #endif
  
  
  
  1.4       +2 -2      apache-apr/pthreads/src/include/http_accept.h
  
  Index: http_accept.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/include/http_accept.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -u -r1.3 -r1.4
  --- http_accept.h     1999/04/14 21:38:28     1.3
  +++ http_accept.h     1999/04/14 22:44:55     1.4
  @@ -79,8 +79,8 @@
   #define USE_ACCEPT_QUEUE
   /*#define USE_MULTI_ACCEPT*/
   
  -void accept_parent_init(pool*);
  -void accept_child_init(pool*, int, int);
  +void accept_parent_init(pool*, int);
  +void accept_child_init(pool*, int);
   void start_accepting_connections(int);
   int  get_connection(struct sockaddr *);
   void stop_accepting_connections(pool*);
  
  
  
  1.5       +34 -26    apache-apr/pthreads/src/main/acceptlock.c
  
  Index: acceptlock.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/main/acceptlock.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -u -r1.4 -r1.5
  --- acceptlock.c      1999/04/14 06:26:12     1.4
  +++ acceptlock.c      1999/04/14 22:44:56     1.5
  @@ -79,6 +79,8 @@
    
   #include "pthread.h" 
   
  +/* Number of cross-process locks we're managing */
  +static int lock_count;
   
   #if defined(USE_FCNTL_SERIALIZED_ACCEPT) || 
defined(USE_FLOCK_SERIALIZED_ACCEPT)
   static void init_lock_fname(pool *p)
  @@ -102,15 +104,16 @@
   
   
   
  -void accept_mutex_init(pool *p)
  +void accept_mutex_init(pool *p, int number_of_locks)
   {
       ptrdiff_t old;
       usptr_t *us;
       int i;
   
  -    uslock = (ulock_t *)ap_palloc(p, ap_acceptors_per_child * 
sizeof(ulock_t));
  +    lock_count = number_of_locks;
  +    uslock = (ulock_t *)ap_palloc(p, lock_count * sizeof(ulock_t));
   
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
       /* default is 8, allocate enough for all the children plus the parent */
           if ((old = usconfig(CONF_INITUSERS, HARD_SERVER_LIMIT + 1)) == -1) {
            perror("usconfig(CONF_INITUSERS)");
  @@ -180,7 +183,7 @@
       int i;
      
       if (accept_mutex != (void *)(caddr_t)-1) {
  -        for (i = 0; i < ap_acceptors_per_child; i++) {
  +        for (i = 0; i < lock_count; i++) {
            if (have_accept_mutex[i]) {
                pthread_mutex_unlock(&accept_mutex[i]);
               }
  @@ -198,20 +201,21 @@
      
       if (accept_mutex != (void *)(caddr_t)-1
           && munmap((caddr_t) accept_mutex,
  -                  sizeof(pthread_mutex_t) * ap_acceptors_per_child)) {
  +                  sizeof(pthread_mutex_t) * lock_count)) {
        perror("munmap");
       }
       accept_mutex = (void *)(caddr_t)-1;
   }
   
  -void accept_mutex_init(pool *p)
  +void accept_mutex_init(pool *p, int number_of_locks)
   {
       pthread_mutexattr_t mattr;
       int fd;
       int i;
      
  +    lock_count = number_of_locks;
       have_accept_mutex = (int *)ap_palloc(p, 
  -                 ap_acceptors_per_child * sizeof(int));
  +                 lock_count * sizeof(int));
   
       fd = open("/dev/zero", O_RDWR);
       if (fd == -1) {
  @@ -219,7 +223,7 @@
           exit(APEXIT_INIT);
       }
       accept_mutex = (pthread_mutex_t *) mmap((caddr_t) 0, 
  -                           sizeof(pthread_mutex_t) * ap_acceptors_per_child, 
  +                           sizeof(pthread_mutex_t) * lock_count, 
                           PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
       if (accept_mutex == (void *) (caddr_t) - 1) {
           perror("mmap");
  @@ -235,7 +239,7 @@
           perror("pthread_mutexattr_setpshared");
           exit(APEXIT_INIT);
       }
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
        if ((errno = pthread_mutex_init(&accept_mutex[i], &mattr))) {
            perror("pthread_mutex_init");
            exit(APEXIT_INIT);
  @@ -329,7 +333,7 @@
       union semun ick;
       int i;
   
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           if (sem_id[i] < 0)
          return;
        /* this is ignored anyhow */
  @@ -340,15 +344,16 @@
   
   
   
  -void accept_mutex_init(pool *p)
  +void accept_mutex_init(pool *p, int number_of_locks)
   {
       union semun ick;
       struct semid_ds buf;
       int i;
      
  -    sem_id = (int *)ap_palloc(p, ap_acceptors_per_child * sizeof(int));
  +    lock_count = number_of_locks;
  +    sem_id = (int *)ap_palloc(p, lock_count * sizeof(int));
   
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           /* acquire the semaphore */
           sem_id[i] = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600);
        if (sem_id[i] < 0) {
  @@ -413,12 +418,13 @@
    * Initialize mutex lock.
    * Must be safe to call this on a restart.
    */
  -void accept_mutex_init(pool *p)
  +void accept_mutex_init(pool *p, int number_of_locks)
   {
       int i;
       char * lock_fname;
  -    lock_fd = (int *)ap_palloc(p, ap_acceptors_per_child * sizeof(int *));
   
  +    lock_count = number_of_locks;
  +    lock_fd = (int *)ap_palloc(p, lock_count * sizeof(int *));
       lock_it.l_whence = SEEK_SET;     /* from current point */
       lock_it.l_start = 0;             /* -"- */
       lock_it.l_len = 0;                       /* until end of file */
  @@ -431,7 +437,7 @@
       unlock_it.l_pid = 0;             /* pid not actually interesting */
   
       init_lock_fname(p);
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           lock_fname = expand_lock_fname(p, i);
        lock_fd[i] = ap_popenf(p, lock_fname, 
                               O_CREAT | O_WRONLY | O_EXCL, 0644);
  @@ -488,7 +494,7 @@
       int i;
     
       char * lock_fname;
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           lock_fname = expand_lock_fname(foo, i);
           unlink(lock_fname);
       }
  @@ -502,7 +508,7 @@
   {
       int i;
     
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           char *lock_fname = expand_lock_fname(p, i);
       
           lock_fd[i] = ap_popenf(p, lock_fname, O_WRONLY, 0600);
  @@ -519,14 +525,15 @@
    * Initialize mutex lock.
    * Must be safe to call this on a restart.
    */
  -void accept_mutex_init(pool *p)
  +void accept_mutex_init(pool *p, int number_of_locks)
   {
       int i;
       char *lock_fname;
  -    lock_fd = (int *)ap_palloc(p, ap_acceptors_per_child * sizeof(int *));
     
  +    lock_count = number_of_locks;
  +    lock_fd = (int *)ap_palloc(p, lock_count * sizeof(int *));
       init_lock_fname(p);
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           lock_fname = expand_lock_fname(p, i);
           unlink(lock_fname);
           lock_fd[i] = ap_popenf(p, lock_fname, 
  @@ -574,7 +581,7 @@
   { 
       int i;
     
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           DosReleaseMutexSem(lock_sem[i]);
        DosCloseMutexSem(lock_sem[i]);
       }
  @@ -588,7 +595,7 @@
   {
       int i;
       
  -    for(i = 0; i < ap_acceptors_per_child; i++) {
  +    for(i = 0; i < lock_count; i++) {
           int rc = DosOpenMutexSem(NULL, &lock_sem[locknum]);
   
        if (rc != 0) {
  @@ -602,14 +609,15 @@
    * Initialize mutex lock.
    * Must be safe to call this on a restart.
    */
  -void accept_mutex_init(pool *p)
  +void accept_mutex_init(pool *p, int number_of_locks)
   {
       int rc;
       int i;
   
  -    lock_fd = (int *)ap_palloc(p, ap_acceptors_per_child * sizeof(int *));
  +    lock_count = number_of_locks;
  +    lock_fd = (int *)ap_palloc(p, lock_count * sizeof(int *));
   
  -    for (i = 0; i < ap_acceptors_per_child; i++) {
  +    for (i = 0; i < lock_count; i++) {
           rc = DosCreateMutexSem(NULL, &lock_sem[i], DC_SEM_SHARED, FALSE);
   
        if (rc != 0) {
  
  
  
  1.6       +12 -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.5
  retrieving revision 1.6
  diff -u -u -r1.5 -r1.6
  --- http_accept.c     1999/04/14 21:38:28     1.5
  +++ http_accept.c     1999/04/14 22:44:57     1.6
  @@ -69,6 +69,7 @@
    * threads can now exit */
   static int workers_may_exit = 0;
   static int requests_this_child;
  +static int num_listenfds;
   
   #if defined (USE_ACCEPT_QUEUE)
   /* The queue of sockets we've accepted */
  @@ -181,9 +182,10 @@
       }
   }
   
  -void accept_parent_init(pool *pconf)
  +void accept_parent_init(pool *pconf, int listener_count)
   {
  -    SAFE_ACCEPT(accept_mutex_init(pconf));
  +    SAFE_ACCEPT(accept_mutex_init(pconf, listener_count));
  +    ap_acceptors_per_child = num_listenfds = listener_count;
   }
   
   /*
  @@ -197,10 +199,9 @@
    * 4. Simply access the globals (yech...)
    */
   void accept_child_init(pool* pchild, 
  -                 int worker_threads_per_child, 
  -                 int acceptor_threads_per_child) 
  +                 int worker_threads_per_child)
   {
  -    int queue_capacity = worker_threads_per_child + 
acceptor_threads_per_child;
  +    int queue_capacity = worker_threads_per_child + ap_acceptors_per_child;
       SAFE_ACCEPT(accept_mutex_child_init(pchild));
       requests_this_child = ap_max_requests_per_child;
       queue_init(&csd_queue, queue_capacity, pchild);
  @@ -315,17 +316,17 @@
    * Worker threads do the accept and process the request. 
    */
   static listen_rec *head_listener;
  -static int num_listenfds;
   static struct pollfd *listenfds;
   
  -void accept_parent_init(pool *pconf)
  +void accept_parent_init(pool *pconf, int listener_count)
   {
  -    SAFE_ACCEPT(accept_mutex_init(pconf));
  +    SAFE_ACCEPT(accept_mutex_init(pconf, 1));
  +    num_listenfds = listener_count;
  +    ap_acceptors_per_child = 0;
   }
   
   void accept_child_init(pool* pchild, 
  -                 int worker_threads_per_child, 
  -                 int acceptors_per_child) 
  +                 int worker_threads_per_child)
   {
       int i;
       listen_rec *lr;
  @@ -333,7 +334,6 @@
       SAFE_ACCEPT(accept_mutex_child_init(pchild));
       requests_this_child = ap_max_requests_per_child;
       head_listener = ap_listeners;
  -    num_listenfds = acceptors_per_child;
   
       listenfds = ap_palloc(pchild, sizeof(struct pollfd) * num_listenfds);
   
  @@ -343,8 +343,8 @@
        listenfds[i].events = POLLIN; /* should we add POLLPRI ?*/
        listenfds[i].revents = 0;
       }
  -
   }
  +
   void start_accepting_connections(int my_child_num) 
   {
   }
  
  
  
  1.71      +8 -6      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.70
  retrieving revision 1.71
  diff -u -u -r1.70 -r1.71
  --- http_main.c       1999/04/14 21:38:29     1.70
  +++ http_main.c       1999/04/14 22:44:57     1.71
  @@ -1467,13 +1467,13 @@
   
   
   /* open sockets, and turn the listeners list into a singly linked ring */
  -static void setup_listeners(pool *p)
  +static int setup_listeners(pool *p)
   {
       listen_rec *lr;
       int fd;
  +    int listener_count = 0;
   
       lr = ap_listeners;
  -    ap_acceptors_per_child = 0;
       for (;;) {
        fd = find_listener(lr);
        if (fd < 0) {
  @@ -1483,7 +1483,7 @@
            ap_note_cleanups_for_socket(p, fd);
        }
        if (fd >= 0) {
  -            ++ap_acceptors_per_child;
  +            ++listener_count;
        }
        lr->fd = fd;
        if (lr->next == NULL)
  @@ -1504,6 +1504,7 @@
                    "SERIALIZED_ACCEPT.");
       }
   #endif
  +    return listener_count;
   }
   
   
  @@ -1948,7 +1949,7 @@
       /*stuff to do before we switch id's, so we have permissions.*/
       reopen_scoreboard(pchild);
   
  -    accept_child_init(pchild, ap_threads_per_child, ap_acceptors_per_child);
  +    accept_child_init(pchild, ap_threads_per_child);
   
       set_group_privs();
   
  @@ -2294,6 +2295,7 @@
   static void one_config_cycle(void)
   {
       int remaining_children_to_start;
  +    int listener_count;
   
       copy_listeners(pconf);
       if (!is_graceful) {
  @@ -2302,13 +2304,13 @@
       ap_clear_pool(pconf);
       ptemp = ap_make_sub_pool(pconf);
       server_conf = ap_read_config(pconf, ptemp, ap_server_confname);
  -    setup_listeners(pconf);
  +    listener_count = setup_listeners(pconf);
       ap_open_logs(server_conf, pconf);
       ap_log_pid(pconf, ap_pid_fname);
       ap_set_version();
       ap_init_modules(pconf, server_conf);
       version_locked++;
  -    accept_parent_init(pconf);
  +    accept_parent_init(pconf, listener_count);
       if (!is_graceful) {
        reinit_scoreboard(pconf);
       }
  
  
  

Reply via email to