You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by br...@apache.org on 2002/09/01 06:26:32 UTC

cvs commit: httpd-2.0/support ab.c

brianp      2002/08/31 21:26:32

  Modified:    support  ab.c
  Log:
  Switched ab to the new abstract pollset API  (this will
  allow ab to take advantage of future apr_pollset_t scalability
  improvements)
  
  Revision  Changes    Path
  1.118     +54 -23    httpd-2.0/support/ab.c
  
  Index: ab.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/support/ab.c,v
  retrieving revision 1.117
  retrieving revision 1.118
  diff -u -r1.117 -r1.118
  --- ab.c	30 Aug 2002 12:26:14 -0000	1.117
  +++ ab.c	1 Sep 2002 04:26:32 -0000	1.118
  @@ -350,7 +350,7 @@
   struct data *stats;		/* date for each request */
   apr_pool_t *cntxt;
   
  -apr_pollfd_t *readbits;
  +apr_pollset_t *readbits;
   
   apr_sockaddr_t *destsa;
   
  @@ -788,7 +788,14 @@
   #ifdef USE_SSL
       if (ssl != 1)
   #endif
  -    apr_poll_socket_add(readbits, c->aprsock, APR_POLLIN);
  +    {
  +        apr_pollfd_t new_pollfd;
  +        new_pollfd.desc_type = APR_POLL_SOCKET;
  +        new_pollfd.reqevents = APR_POLLIN;
  +        new_pollfd.desc.s = c->aprsock;
  +        new_pollfd.client_data = c;
  +        apr_pollset_add(readbits, &new_pollfd);
  +    }
   }
   
   /* --------------------------------------------------------- */
  @@ -1241,13 +1248,21 @@
       c->start = apr_time_now();
       if ((rv = apr_connect(c->aprsock, destsa)) != APR_SUCCESS) {
   	if (APR_STATUS_IS_EINPROGRESS(rv)) {
  +            apr_pollfd_t new_pollfd;
   	    c->state = STATE_CONNECTING;
   	    c->rwrite = 0;
  -	    apr_poll_socket_add(readbits, c->aprsock, APR_POLLOUT);
  +            new_pollfd.desc_type = APR_POLL_SOCKET;
  +            new_pollfd.reqevents = APR_POLLIN;
  +            new_pollfd.desc.s = c->aprsock;
  +            new_pollfd.client_data = c;
  +	    apr_pollset_add(readbits, &new_pollfd);
   	    return;
   	}
   	else {
  -	    apr_poll_socket_remove(readbits, c->aprsock);
  +            apr_pollfd_t remove_pollfd;
  +            remove_pollfd.desc_type = APR_POLL_SOCKET;
  +            remove_pollfd.desc.s = c->aprsock;
  +	    apr_pollset_remove(readbits, &remove_pollfd);
   	    apr_socket_close(c->aprsock);
   	    err_conn++;
   	    if (bad++ > 10) {
  @@ -1310,13 +1325,15 @@
           SSL_shutdown(c->ssl);
           SSL_free(c->ssl);
       }
  -    else {
  +    else
   #endif
  -    apr_poll_socket_remove(readbits, c->aprsock);
  -    apr_socket_close(c->aprsock);
  -#ifdef USE_SSL
  +    {
  +        apr_pollfd_t remove_pollfd;
  +        remove_pollfd.desc_type = APR_POLL_SOCKET;
  +        remove_pollfd.desc.s = c->aprsock;
  +        apr_pollset_remove(readbits, &remove_pollfd);
  +        apr_socket_close(c->aprsock);
       }
  -#endif
       c->state = STATE_UNCONNECTED;
   
       /* connect again */
  @@ -1417,7 +1434,10 @@
   	    }
   	    else {
   		/* header is in invalid or too big - close connection */
  -		apr_poll_socket_remove(readbits, c->aprsock);
  +                apr_pollfd_t remove_pollfd;
  +                remove_pollfd.desc_type = APR_POLL_SOCKET;
  +                remove_pollfd.desc.s = c->aprsock;
  +                apr_pollset_remove(readbits, &remove_pollfd);
   		apr_socket_close(c->aprsock);
   		err_response++;
   		if (bad++ > 10) {
  @@ -1560,7 +1580,7 @@
       con = calloc(concurrency * sizeof(struct connection), 1);
       
       stats = calloc(requests * sizeof(struct data), 1);
  -    apr_poll_setup(&readbits, concurrency, cntxt);
  +    apr_pollset_create(&readbits, concurrency, cntxt, 0);
   
       /* setup request */
       if (posting <= 0) {
  @@ -1644,6 +1664,7 @@
       while (done < requests) {
   	apr_int32_t n;
   	apr_int32_t timed;
  +        const apr_pollfd_t *pollresults;
   
   	/* check for time limit expiry */
   	now = apr_time_now();
  @@ -1659,7 +1680,7 @@
               status = APR_SUCCESS;
           else
   #endif
  -	status = apr_poll(readbits, concurrency, &n, aprtimeout);
  +	status = apr_pollset_poll(readbits, aprtimeout, &n, &pollresults);
   	if (status != APR_SUCCESS)
   	    apr_err("apr_poll", status);
   
  @@ -1667,11 +1688,14 @@
   	    err("\nServer timed out\n\n");
   	}
   
  -	for (i = 0; i < concurrency; i++) {
  +	for (i = 0; i < n; i++) {
  +            const apr_pollfd_t *next_fd = &(pollresults[i]);
  +            struct connection *c = next_fd->client_data;
  +
   	    /*
   	     * If the connection isn't connected how can we check it?
   	     */
  -	    if (con[i].state == STATE_UNCONNECTED)
  +	    if (c->state == STATE_UNCONNECTED)
   		continue;
   
   #ifdef USE_SSL
  @@ -1679,7 +1703,8 @@
                   rv = APR_POLLIN;
               else
   #endif
  -	    apr_poll_revents_get(&rv, con[i].aprsock, readbits);
  +            rv = next_fd->rtnevents;
  +
   	    /*
   	     * Notes: APR_POLLHUP is set after FIN is received on some
   	     * systems, so treat that like APR_POLLIN so that we try to read
  @@ -1693,15 +1718,15 @@
   	     * apr_poll().
   	     */
   	    if ((rv & APR_POLLIN) || (rv & APR_POLLPRI) || (rv & APR_POLLHUP))
  -		read_connection(&con[i]);
  +		read_connection(c);
   	    if ((rv & APR_POLLERR) || (rv & APR_POLLNVAL)) {
   		bad++;
   		err_except++;
  -		start_connect(&con[i]);
  +		start_connect(c);
   		continue;
   	    }
   	    if (rv & APR_POLLOUT)
  -		write_request(&con[i]);
  +		write_request(c);
   
   	    /*
   	     * When using a select based poll every time we check the bits
  @@ -1713,9 +1738,15 @@
   #ifdef USE_SSL
               if (ssl != 1)
   #endif
  -	    if (con[i].state == STATE_READ || con[i].state == STATE_CONNECTING)
  -		apr_poll_socket_add(readbits, con[i].aprsock, APR_POLLIN);
  -
  +	    if (c->state == STATE_READ ||
  +                c->state == STATE_CONNECTING) {
  +                    apr_pollfd_t new_pollfd;
  +                    new_pollfd.desc_type = APR_POLL_SOCKET;
  +                    new_pollfd.reqevents = APR_POLLIN;
  +                    new_pollfd.desc.s = c->aprsock;
  +                    new_pollfd.client_data = c;
  +                    apr_pollset_add(readbits, &new_pollfd);
  +                }
   	}
       }