mturk       2005/07/02 10:18:46

  Modified:    http11/src/java/org/apache/coyote/http11
                        Http11AprProcessor.java
               util/java/org/apache/tomcat/util/net AprEndpoint.java
  Log:
  Fix the Sendfile implementation.
  The APR sendfile always make it's internal full loop if the
  socket timeout is larger then 0. Setting soket timeout to
  zero also makes the socket nonblocking.
  I have added a keepAlive flag to the sendfile data because with
  sendfile the processing is done inside senfile poller.
  
  Revision  Changes    Path
  1.18      +6 -0      
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11AprProcessor.java
  
  Index: Http11AprProcessor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11AprProcessor.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- Http11AprProcessor.java   23 Jun 2005 11:47:32 -0000      1.17
  +++ Http11AprProcessor.java   2 Jul 2005 17:18:46 -0000       1.18
  @@ -884,9 +884,15 @@
               // Do sendfile as needed: add socket to sendfile and end
               if (sendfileData != null) {
                   sendfileData.socket = socket;
  +                     sendfileData.keepAlive = keepAlive;
                   if (!endpoint.getSendfile().add(sendfileData)) {
                       keepAlive = false;
  +                    openSocket = false;
                   }
  +                else {
  +                     openSocket = true;
  +                }
  +                break;
               }
               
           }
  
  
  
  1.54      +19 -10    
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.53
  retrieving revision 1.54
  diff -u -r1.53 -r1.54
  --- AprEndpoint.java  2 Jul 2005 10:55:34 -0000       1.53
  +++ AprEndpoint.java  2 Jul 2005 17:18:46 -0000       1.54
  @@ -1062,6 +1062,8 @@
           public long socket;
           // Position
           public long pos;
  +        // KeepAlive flag
  +        public boolean keepAlive;
       }
   
   
  @@ -1147,10 +1149,10 @@
                        0, data.fdpool);
                   data.pos = data.start;
                   // Set the socket to nonblocking mode
  -                Socket.optSet(data.socket, Socket.APR_SO_NONBLOCK, 1);
  +                Socket.timeoutSet(data.socket, 0);
                   while (true) {
                       long nw = Socket.sendfile(data.socket, data.fd, null, 
null,
  -                                             data.pos, data.end, 0);
  +                                              data.pos, data.end, 0);
                       if (nw < 0) {
                           if (!(-nw == Status.EAGAIN)) {
                                /* The socket will be destroyed on the
  @@ -1167,7 +1169,7 @@
                               // Entire file has been send
                               Pool.destroy(data.fdpool);
                               // Set back socket to blocking mode
  -                            Socket.optSet(data.socket, 
Socket.APR_SO_NONBLOCK, 0);
  +                            Socket.timeoutSet(data.socket, soTimeout * 1000);
                               return true;
                           }
                       }
  @@ -1182,7 +1184,7 @@
                   addS.add(data);
                   addS.notify();
               }
  -            return false;
  +            return true;
           }
   
           /**
  @@ -1260,7 +1262,6 @@
                                   // Close socket and clear pool
                                   remove(state);
                                   // Destroy file descriptor pool, which 
should close the file
  -                                Pool.destroy(state.fdpool);
                                   // Close the socket, as the reponse would be 
incomplete
                                   Socket.destroy(state.socket);
                                   continue;
  @@ -1281,11 +1282,19 @@
                               state.pos = state.pos + nw;
                               if (state.pos >= state.end) {
                                   remove(state);
  -                                // Destroy file descriptor pool, which 
should close the file
  -                                Pool.destroy(state.fdpool);
  -                                // If all done hand this socket off to a 
worker for
  -                                // processing of further requests
  -                                getWorkerThread().assign(desc[n*2+1]);
  +                                if (state.keepAlive) {
  +                                     // Destroy file descriptor pool, which 
should close the file
  +                                     Pool.destroy(state.fdpool);
  +                                     Socket.timeoutSet(state.socket, 
soTimeout * 1000);
  +                                     // If all done hand this socket off to 
a worker for
  +                                     // processing of further requests
  +                                     getWorkerThread().assign(state.socket);
  +                                }
  +                                else {
  +                                     // Close the socket since this is
  +                                     // the end of not keep-alive request.
  +                                     Socket.destroy(state.socket);   
  +                                }
                               }
                           }
                       } else if (rv < 0) {
  
  
  

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

Reply via email to