You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by st...@apache.org on 2001/07/30 19:56:17 UTC

cvs commit: apr/network_io/unix sockopt.c sendrecv.c

stoddard    01/07/30 10:56:17

  Modified:    .        CHANGES
               include  apr_network_io.h
               network_io/unix sockopt.c sendrecv.c
  Log:
  Performance: Add new socket option, APR_INCOMPLETE_READ, that should be
  set when you expect the first non-blocking read to fail with
  EAGAIN. Setting APR_INCOMPLETE_READ prior to calling apr_read
  will cause select() to be called first to wait for bytes
  to read. [Brian Pane, Dean Gaudet]
  
  Reviewed by:	Bill Stoddard
  
  Revision  Changes    Path
  1.129     +6 -0      apr/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apr/CHANGES,v
  retrieving revision 1.128
  retrieving revision 1.129
  diff -u -r1.128 -r1.129
  --- CHANGES	2001/07/26 00:08:40	1.128
  +++ CHANGES	2001/07/30 17:56:16	1.129
  @@ -1,5 +1,11 @@
   Changes with APR b1  
   
  +  *) Add new socket option, APR_INCOMPLETE_READ, that should be
  +     set when you expect the first non-blocking read to fail with
  +     EAGAIN. Setting APR_INCOMPLETE_READ prior to calling apr_read
  +     will cause select() to be called first to wait for bytes
  +     to read. [Brian Pane, Dean Gaudet]
  +
     *) Better installation.  This makes us install the APRVARS file,
        as well as MM.  [Ryan Bloom]
   
  
  
  
  1.108     +11 -0     apr/include/apr_network_io.h
  
  Index: apr_network_io.h
  ===================================================================
  RCS file: /home/cvs/apr/include/apr_network_io.h,v
  retrieving revision 1.107
  retrieving revision 1.108
  diff -u -r1.107 -r1.108
  --- apr_network_io.h	2001/07/26 15:39:25	1.107
  +++ apr_network_io.h	2001/07/30 17:56:16	1.108
  @@ -103,6 +103,17 @@
                                      * APR_TCP_NODELAY should be turned on
                                      * again when NOPUSH is turned off
                                      */
  +#define APR_INCOMPLETE_READ 4096  /* Set on non-blocking sockets
  +				   * (APR_SO_TIMEOUT != 0) on which the
  +				   * previous read() did not fill a buffer
  +				   * completely.  the next apr_recv() will
  +				   * first call select()/poll() rather than
  +				   * going straight into read().  (Can also
  +				   * be set by an application to force a
  +				   * select()/poll() call before the next
  +				   * read, in cases where the app expects
  +				   * that an immediate read would fail.)
  +				   */
   
   #define APR_POLLIN    0x001 
   #define APR_POLLPRI   0x002
  
  
  
  1.48      +9 -0      apr/network_io/unix/sockopt.c
  
  Index: sockopt.c
  ===================================================================
  RCS file: /home/cvs/apr/network_io/unix/sockopt.c,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- sockopt.c	2001/07/25 18:01:01	1.47
  +++ sockopt.c	2001/07/30 17:56:16	1.48
  @@ -203,6 +203,12 @@
                   }
               } 
           }
  +	/* must disable the incomplete read support if we change to a
  +	 * blocking socket.
  +	 */
  +	if (on == 0) {
  +	    sock->netmask &= ~APR_INCOMPLETE_READ;
  +	}
           sock->timeout = on; 
           apr_set_option(&sock->netmask, APR_SO_TIMEOUT, on);
       } 
  @@ -265,6 +271,9 @@
   #else
           return APR_ENOTIMPL;
   #endif
  +    }
  +    if (opt & APR_INCOMPLETE_READ) {
  +	apr_set_option(&sock->netmask, APR_INCOMPLETE_READ, on);
       }
   
       return APR_SUCCESS; 
  
  
  
  1.75      +12 -2     apr/network_io/unix/sendrecv.c
  
  Index: sendrecv.c
  ===================================================================
  RCS file: /home/cvs/apr/network_io/unix/sendrecv.c,v
  retrieving revision 1.74
  retrieving revision 1.75
  diff -u -r1.74 -r1.75
  --- sendrecv.c	2001/07/26 17:11:04	1.74
  +++ sendrecv.c	2001/07/30 17:56:16	1.75
  @@ -125,14 +125,21 @@
   apr_status_t apr_recv(apr_socket_t *sock, char *buf, apr_size_t *len)
   {
       ssize_t rv;
  -    
  +    apr_status_t arv;
  +
  +    if (sock->netmask & APR_INCOMPLETE_READ) {
  +	sock->netmask &= ~APR_INCOMPLETE_READ;
  +    	goto do_select;
  +    }
  +
       do {
           rv = read(sock->socketdes, buf, (*len));
       } while (rv == -1 && errno == EINTR);
   
       if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && 
         sock->timeout != 0) {
  -        apr_status_t arv = apr_wait_for_io_or_timeout(sock, 1);
  +do_select:
  +	arv = apr_wait_for_io_or_timeout(sock, 1);
           if (arv != APR_SUCCESS) {
               *len = 0;
               return arv;
  @@ -146,6 +153,9 @@
       if (rv == -1) {
           (*len) = 0;
           return errno;
  +    }
  +    if (sock->timeout && rv < *len) {
  +	sock->netmask |= APR_INCOMPLETE_READ;
       }
       (*len) = rv;
       if (rv == 0) {