manoj 99/06/28 19:49:30
Modified: mpm/src/main listen.c mpm/src/modules/mpm/mpmt_pthread http_accept.c mpm/src/include ap_listen.h Log: Change method of checking for active FDs after poll() in the pthread MPM. The new method doesn't require any changes to the listen abstraction. Revision Changes Path 1.3 +0 -1 apache-2.0/mpm/src/main/listen.c Index: listen.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/main/listen.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -u -r1.2 -r1.3 --- listen.c 1999/06/27 03:45:14 1.2 +++ listen.c 1999/06/29 02:49:26 1.3 @@ -182,7 +182,6 @@ new = malloc(sizeof(ap_listen_rec)); new->local_addr = *local_addr; new->fd = -1; - new->index = -1; new->next = ap_listeners; ap_listeners = new; } 1.3 +17 -21 apache-2.0/mpm/src/modules/mpm/mpmt_pthread/http_accept.c Index: http_accept.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/mpmt_pthread/http_accept.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -u -r1.2 -r1.3 --- http_accept.c 1999/06/27 03:45:15 1.2 +++ http_accept.c 1999/06/29 02:49:27 1.3 @@ -303,8 +303,8 @@ * USE_MULTI_ACCEPT * Worker threads do the accept and process the request. */ -static ap_listen_rec *last_lr; static struct pollfd *listenfds; +static int last_pollfd = 0; void accept_parent_init(pool *pconf, int listener_count) { @@ -322,14 +322,12 @@ SAFE_ACCEPT(intra_mutex_init(pchild, 1)); SAFE_ACCEPT(accept_mutex_child_init(pchild)); requests_this_child = ap_max_requests_per_child; - last_lr = ap_listeners; listenfds = ap_palloc(pchild, sizeof(struct pollfd) * (num_listenfds + 1)); listenfds[0].fd = ap_pipe_of_death[0]; listenfds[0].events = POLLIN; listenfds[0].revents = 0; for (lr = ap_listeners, i = 1; i <= num_listenfds; lr = lr->next, ++i) { - lr->index = i; listenfds[i].fd = lr->fd; listenfds[i].events = POLLIN; /* should we add POLLPRI ?*/ listenfds[i].revents = 0; @@ -347,6 +345,7 @@ int ret; ap_listen_rec *lr; char pipe_read_char; + int curr_pollfd; size_t len = sizeof(struct sockaddr); @@ -405,36 +404,33 @@ continue; } - /* This conditional is used because the single listen case is the - * only one where the accept might not be serialized. In that - * case, multiple threads mucking around with the last_lr - * pointer will be harmful */ + /* This conditional is used because the single listen case + * is the only one where the accept might not be serialized. + * In that case, multiple threads mucking around with + * listenfds or last_pollfd will be harmful */ if (num_listenfds == 1) { /* only one socket, just pretend we did the other stuff */ sd = ap_listeners->fd; } else { /* find a listener */ - lr = last_lr; + curr_pollfd = last_pollfd; do { - /* XXX: should we check for POLLERR? */ - if (listenfds[lr->index].revents & POLLIN) { - last_lr = lr->next; - if (last_lr == NULL) { - last_lr = ap_listeners; - } - goto got_lr; + curr_pollfd++; + if (curr_pollfd > num_listenfds) { + curr_pollfd = 1; } - lr = lr->next; - if (lr == NULL) { - lr = ap_listeners; + /* XXX: Should we check for POLLERR? */ + if (listenfds[curr_pollfd].revents & POLLIN) { + last_pollfd = curr_pollfd; + sd = listenfds[curr_pollfd].fd; + goto got_lr; } - } while (lr != last_lr); + } while (curr_pollfd != last_pollfd); /* if we don't find anything then just start again */ continue; - got_lr: - sd = lr->fd; } + got_lr: csd = ap_accept(sd, sa_client, &len); requests_this_child--; 1.3 +0 -1 apache-2.0/mpm/src/include/ap_listen.h Index: ap_listen.h =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/include/ap_listen.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -u -r1.2 -r1.3 --- ap_listen.h 1999/06/27 03:45:13 1.2 +++ ap_listen.h 1999/06/29 02:49:29 1.3 @@ -64,7 +64,6 @@ struct sockaddr_in local_addr; /* local IP address and port */ /* TODO: replace the fd with APR stuff */ int fd; - int index; /* index into pollfd array */ /* more stuff here, like which protocol is bound to the port */ };