mturk       2005/04/19 09:36:19

  Modified:    util/java/org/apache/tomcat/util/net AprEndpoint.java
  Log:
  Use Poll.maintain for removing timed out sockets. Also use remove
  flag for Poll.poll to skip calling extra JNI function for common case.
  
  Revision  Changes    Path
  1.10      +65 -38    
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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- AprEndpoint.java  18 Apr 2005 16:47:47 -0000      1.9
  +++ AprEndpoint.java  19 Apr 2005 16:36:19 -0000      1.10
  @@ -286,15 +286,15 @@
        */
       protected int keepAliveCount = 0;
       public int getKeepAliveCount() { return keepAliveCount; }
  -    
  -    
  +
  +
       /**
        * Number of sendfile sockets.
        */
       protected int sendfileCount = 0;
       public int getSendfileCount() { return sendfileCount; }
  -    
  -    
  +
  +
       /**
        * The socket poller.
        */
  @@ -307,8 +307,8 @@
        */
       protected Sendfile sendfile = null;
       public Sendfile getSendfile() { return sendfile; }
  -    
  -    
  +
  +
       /**
        * Dummy maxSpareThreads property.
        */
  @@ -740,30 +740,46 @@
               try {
                   serverPollset = Poll.create(pollerSize, pool, 0, soTimeout * 
1000);
               } catch (Error e) {
  -                // FIXME: more appropriate logging
  -                e.printStackTrace();
  +                if (Status.APR_STATUS_IS_EINVAL(e.getError())) {
  +                    try {
  +                        /* Use WIN32 maximum poll size */
  +                        pollerSize = 62;
  +                        serverPollset = Poll.create(pollerSize, pool, 0, 
soTimeout * 1000);
  +                    } catch (Error err) {
  +                        // FIXME: more appropriate logging
  +                        err.printStackTrace();
  +                    }
  +                } else {
  +                    // FIXME: more appropriate logging
  +                    e.printStackTrace();
  +                }
               }
               desc = new long[pollerSize * 4];
  +            keepAliveCount = 0;
           }
   
           protected void destroy() {
               Pool.destroy(pool);
           }
  -        
  +
           public void add(long socket, long pool) {
  -            int rv = Poll.add(serverPollset, socket, pool, Poll.APR_POLLIN);
  -            if (rv == Status.APR_SUCCESS) {
  -                keepAliveCount++;
  -            } else {
  -                // Can't do anything: close the socket right away
  -                Pool.destroy(pool);
  +            synchronized (this) {
  +                int rv = Poll.add(serverPollset, socket, pool, 
Poll.APR_POLLIN);
  +                if (rv == Status.APR_SUCCESS) {
  +                    keepAliveCount++;
  +                } else {
  +                    // Can't do anything: close the socket right away
  +                    Pool.destroy(pool);
  +                }
               }
           }
   
           public void remove(long socket) {
  -            int rv = Poll.remove(serverPollset, socket);
  -            if (rv == Status.APR_SUCCESS) {
  -                keepAliveCount--;
  +            synchronized (this) {
  +                int rv = Poll.remove(serverPollset, socket);
  +                if (rv == Status.APR_SUCCESS) {
  +                    keepAliveCount--;
  +                }
               }
           }
   
  @@ -775,7 +791,7 @@
   
               // Loop until we receive a shutdown command
               while (running) {
  -
  +                long maintainTime = 0;
                   // Loop if endpoint is paused
                   while (paused) {
                       try {
  @@ -795,11 +811,9 @@
   
                   try {
                       // Pool for the specified interval
  -                    int rv = Poll.poll(serverPollset, pollTime, desc);
  +                    int rv = Poll.poll(serverPollset, pollTime, desc, true);
                       if (rv > 0) {
                           for (int n = 0; n < rv; n++) {
  -                            // Remove the socket from the pollset
  -                            remove(desc[n*4+1]);
                               // Check for failed sockets
                               if (((desc[n*4] & Poll.APR_POLLHUP) == 
Poll.APR_POLLHUP)
                                       || ((desc[n*4] & Poll.APR_POLLERR) == 
Poll.APR_POLLERR)) {
  @@ -810,6 +824,7 @@
                               // Hand this socket off to a worker
                               getWorkerThread().assign(desc[n*4+1], 
desc[n*4+2]);
                           }
  +                        maintainTime += pollTime;
                       } else if (rv < 0) {
                           // FIXME: Log with WARN at least
                           // Handle poll critical failure
  @@ -819,6 +834,18 @@
                               init();
                           }
                       }
  +                    if (rv == 0 || maintainTime > 1000000L) {
  +                        synchronized (this) {
  +                            rv = Poll.maintain(serverPollset, desc, true);
  +                            maintainTime = 0;
  +                        }
  +                        if (rv > 0) {
  +                            for (int n = 0; n < rv; n++) {
  +                                // Close socket and clear pool
  +                                Pool.destroy(desc[n*4+2]);
  +                            }
  +                        }
  +                    }
                   } catch (Throwable t) {
                       // FIXME: Proper logging
                       t.printStackTrace();
  @@ -970,8 +997,8 @@
           // Position
           public long pos;
       }
  -    
  -    
  +
  +
       // --------------------------------------------------- Sendfile Inner 
Class
   
   
  @@ -979,7 +1006,7 @@
        * Sendfile class.
        */
       public class Sendfile implements Runnable {
  -        
  +
           protected long sendfilePollset = 0;
           protected long pool = 0;
           protected long[] desc;
  @@ -998,18 +1025,18 @@
               sendfileData = new HashMap(sendfileSize);
               state = new SendfileData[sendfileSize];
           }
  -        
  +
           protected void destroy() {
               sendfileData.clear();
               Pool.destroy(pool);
           }
  -        
  +
           public void add(long socket, SendfileData data) {
               // Initialize fd from data given
               try {
                   data.fdpool = Pool.create(data.pool);
                   data.fd = File.open
  -                    (data.fileName, File.APR_FOPEN_READ 
  +                    (data.fileName, File.APR_FOPEN_READ
                        | File.APR_FOPEN_SENDFILE_ENABLED | 
File.APR_FOPEN_BINARY,
                        0, data.fdpool);
                   data.pos = data.start;
  @@ -1024,14 +1051,14 @@
                   if (rv == Status.APR_SUCCESS) {
                       sendfileCount++;
                   } else {
  -                    // FIXME: Log with a WARN at least, as the request will 
  +                    // FIXME: Log with a WARN at least, as the request will
                       // fail from the user perspective
                       // Can't do anything: close the socket right away
                       Pool.destroy(data.pool);
                   }
               }
           }
  -        
  +
           public void remove(long socket) {
               synchronized (this) {
                   int rv = Poll.remove(sendfilePollset, socket);
  @@ -1041,7 +1068,7 @@
                   sendfileData.remove(new Long(socket));
               }
           }
  -        
  +
           /**
            * The background thread that listens for incoming TCP/IP 
connections and
            * hands them off to an appropriate processor.
  @@ -1070,7 +1097,7 @@
   
                   try {
                       // Pool for the specified interval
  -                    int rv = Poll.poll(sendfilePollset, pollTime, desc);
  +                    int rv = Poll.poll(sendfilePollset, pollTime, desc, 
false);
                       if (rv > 0) {
                           for (int n = 0; n < rv; n++) {
                               // Problem events
  @@ -1085,11 +1112,11 @@
                                   continue;
                               }
                               // Get the sendfile state
  -                            state[n] = 
  +                            state[n] =
                                   (SendfileData) sendfileData.get(new 
Long(desc[n*4+1]));
                               // Write some data using sendfile
  -                            int nw = Socket.sendfilet(desc[n*4+1], 
state[n].fd, 
  -                                                      null, null, 
state[n].pos, 
  +                            int nw = Socket.sendfilet(desc[n*4+1], 
state[n].fd,
  +                                                      null, null, 
state[n].pos,
                                                         (int) (state[n].end - 
state[n].pos), 0, 0);
                               if (nw < 0) {
                                   // Close socket and clear pool
  @@ -1105,7 +1132,7 @@
                                   remove(desc[n*4+1]);
                                   // Destroy file descriptor pool, which 
should close the file
                                   Pool.destroy(state[n].fdpool);
  -                                // If all done hand this socket off to a 
worker for 
  +                                // If all done hand this socket off to a 
worker for
                                   // processing of further requests
                                   getWorkerThread().assign(desc[n*4+1], 
state[n].pool);
                               }
  @@ -1123,7 +1150,7 @@
                       // FIXME: Proper logging
                       t.printStackTrace();
                   }
  -                
  +
               }
   
               // Notify the threadStop() method that we have shut ourselves 
down
  @@ -1135,7 +1162,7 @@
   
       }
   
  -    
  +
       // -------------------------------------- ConnectionHandler Inner 
Interface
   
   
  
  
  

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

Reply via email to