mturk       2005/04/23 10:05:31

  Modified:    util/java/org/apache/tomcat/util/net AprEndpoint.java
  Log:
  Fix partial results from sendfile. Do not break the loop while the
  sendfile will not block.
  
  Revision  Changes    Path
  1.16      +18 -17    
jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java
  
  Index: AprEndpoint.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- AprEndpoint.java  23 Apr 2005 15:57:24 -0000      1.15
  +++ AprEndpoint.java  23 Apr 2005 17:05:31 -0000      1.16
  @@ -1063,25 +1063,26 @@
                   data.pos = data.start;
                   // Set the socket to nonblocking mode
                   Socket.optSet(socket, Socket.APR_SO_NONBLOCK, 1);
  -                int nw = Socket.sendfile(socket, data.fd, null, null,
  -                                         data.pos, (int)data.end, 0);
  -                if (nw < 0) {
  -                    if (!Status.APR_STATUS_IS_EAGAIN(-nw)) {
  -                        Poll.destroy(data.pool);
  -                        return;
  -                    }
  -                }
  -                else {
  -                    data.pos = data.pos + nw;
  -                    if (data.pos >= data.end) {
  -                        // Entire file has been send
  -                        Poll.destroy(data.pool);
  -                        return;
  +                while (true) {
  +                    int nw = Socket.sendfile(socket, data.fd, null, null,
  +                                             data.pos, (int)data.end, 0);
  +                    if (nw < 0) {
  +                        if (!Status.APR_STATUS_IS_EAGAIN(-nw)) {
  +                            Poll.destroy(data.pool);
  +                            return;
  +                        }
  +                        else {
  +                            // Break the loop and add the socket to poller.
  +                            break;    
  +                        }
                       }
                       else {
  -                        //FIXME: Ether EAGAIN of full data should be returned
  -                        Poll.destroy(data.pool);
  -                        return;
  +                        data.pos = data.pos + nw;
  +                        if (data.pos >= data.end) {
  +                            // Entire file has been send
  +                            Poll.destroy(data.pool);
  +                            return;
  +                        }
                       }
                   }
               } catch (Error e) {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to