remm 2005/05/11 04:23:26 Modified: util/java/org/apache/tomcat/util/net AprEndpoint.java http11/src/java/org/apache/coyote/http11 Http11AprProcessor.java Log: - Should fix thread safety issue reported by Bill (needs testing). Revision Changes Path 1.25 +63 -32 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.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- AprEndpoint.java 3 May 2005 09:36:58 -0000 1.24 +++ AprEndpoint.java 11 May 2005 11:23:26 -0000 1.25 @@ -17,6 +17,7 @@ package org.apache.tomcat.util.net; import java.net.InetAddress; +import java.util.ArrayList; import java.util.HashMap; import java.util.Stack; @@ -715,6 +716,10 @@ protected long pool = 0; protected long[] desc; + protected long[] addS; + protected long[] addP; + protected int addCount = 0; + protected synchronized void init() { pool = Pool.create(serverSockPool); try { @@ -735,6 +740,8 @@ } desc = new long[pollerSize * 4]; keepAliveCount = 0; + addS = new long[pollerSize]; + addP = new long[pollerSize]; } protected void destroy() { @@ -742,23 +749,17 @@ } public void add(long socket, long pool) { - synchronized (this) { - int rv = Poll.add(serverPollset, socket, pool, Poll.APR_POLLIN); - if (rv == Status.APR_SUCCESS) { - keepAliveCount++; - } else { + synchronized (addS) { + // Add socket to the list. Newly added sockets will wait + // at most for pollTime before being polled + if (addCount >= addS.length) { // Can't do anything: close the socket right away Pool.destroy(pool); + return; } - } - } - - public void remove(long socket) { - synchronized (this) { - int rv = Poll.remove(serverPollset, socket); - if (rv == Status.APR_SUCCESS) { - keepAliveCount--; - } + addS[addCount] = socket; + addP[addCount] = pool; + addCount++; } } @@ -780,7 +781,7 @@ } } - while (keepAliveCount < 1) { + while (keepAliveCount < 1 && addCount < 1) { try { Thread.sleep(10); } catch (InterruptedException e) { @@ -789,6 +790,22 @@ } try { + // Add sockets which are waiting to the poller + if (addCount > 0) { + synchronized (addS) { + for (int i = 0; i < addCount; i++) { + int rv = Poll.add + (serverPollset, addS[i], addP[i], Poll.APR_POLLIN); + if (rv == Status.APR_SUCCESS) { + keepAliveCount++; + } else { + // Can't do anything: close the socket right away + Pool.destroy(pool); + } + } + addCount = 0; + } + } // Pool for the specified interval int rv = Poll.poll(serverPollset, pollTime, desc, true); if (rv > 0) { @@ -971,7 +988,8 @@ // Range information public long start; public long end; - // Socket pool + // Socket and socket pool + public long socket; public long pool; // Position public long pos; @@ -990,6 +1008,9 @@ protected long pool = 0; protected long[] desc; protected HashMap sendfileData; + + protected ArrayList addS; + protected void init() { pool = Pool.create(serverSockPool); try { @@ -1010,6 +1031,7 @@ } desc = new long[sendfileSize * 4]; sendfileData = new HashMap(sendfileSize); + addS = new ArrayList(); } protected void destroy() { @@ -1017,7 +1039,7 @@ Pool.destroy(pool); } - public boolean add(long socket, SendfileData data) { + public boolean add(SendfileData data) { // Initialize fd from data given try { data.fdpool = Pool.create(data.pool); @@ -1027,9 +1049,9 @@ 0, data.fdpool); data.pos = data.start; // Set the socket to nonblocking mode - Socket.optSet(socket, Socket.APR_SO_NONBLOCK, 1); + Socket.optSet(data.socket, Socket.APR_SO_NONBLOCK, 1); while (true) { - long nw = Socket.sendfile(socket, data.fd, null, null, + long nw = Socket.sendfile(data.socket, data.fd, null, null, data.pos, data.end, 0); if (nw < 0) { if (!Status.APR_STATUS_IS_EAGAIN((int) -nw)) { @@ -1045,7 +1067,7 @@ // Entire file has been send Poll.destroy(data.fdpool); // Set back socket to blocking mode - Socket.optSet(socket, Socket.APR_SO_NONBLOCK, 0); + Socket.optSet(data.socket, Socket.APR_SO_NONBLOCK, 0); return true; } } @@ -1054,17 +1076,10 @@ log.error(sm.getString("endpoint.sendfile.error"), e); return false; } - synchronized (this) { - // Add socket to the poller - sendfileData.put(new Long(socket), data); - int rv = Poll.add(sendfilePollset, socket, 0, Poll.APR_POLLOUT); - if (rv == Status.APR_SUCCESS) { - sendfileCount++; - } else { - log.warn(sm.getString("endpoint.sendfile.addfail", "" + rv)); - // Can't do anything: close the socket right away - Pool.destroy(data.pool); - } + // Add socket to the list. Newly added sockets will wait + // at most for pollTime before being polled + synchronized (addS) { + addS.add(sendfileData); } return false; } @@ -1099,7 +1114,7 @@ } } - while (sendfileCount < 1) { + while (sendfileCount < 1 && addS.size() < 1) { try { Thread.sleep(10); } catch (InterruptedException e) { @@ -1108,6 +1123,22 @@ } try { + // Add socket to the poller + if (addS.size() > 0) { + for (int i = 0; i < addS.size(); i++) { + SendfileData data = (SendfileData) addS.get(i); + int rv = Poll.add(sendfilePollset, data.socket, 0, Poll.APR_POLLOUT); + if (rv == Status.APR_SUCCESS) { + sendfileData.put(new Long(data.socket), data); + sendfileCount++; + } else { + log.warn(sm.getString("endpoint.sendfile.addfail", "" + rv)); + // Can't do anything: close the socket right away + Pool.destroy(data.pool); + } + } + addS.clear(); + } // Pool for the specified interval int rv = Poll.poll(sendfilePollset, pollTime, desc, false); if (rv > 0) { 1.11 +2 -1 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.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- Http11AprProcessor.java 28 Apr 2005 12:30:38 -0000 1.10 +++ Http11AprProcessor.java 11 May 2005 11:23:26 -0000 1.11 @@ -872,8 +872,9 @@ // Do sendfile as needed: add socket to sendfile and end if (sendfileData != null) { + sendfileData.socket = socket; sendfileData.pool = pool; - if (!endpoint.getSendfile().add(socket, sendfileData)) { + if (!endpoint.getSendfile().add(sendfileData)) { keepAlive = false; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]