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]