Author: remm
Date: Sat Aug 5 06:57:54 2006
New Revision: 429001
URL: http://svn.apache.org/viewvc?rev=429001&view=rev
Log:
- Fix the accept algorithm, that I had translated inaccurately in the new
endpoints.
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=429001&r1=429000&r2=429001&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat
Aug 5 06:57:54 2006
@@ -1012,6 +1012,26 @@
/**
* Process given socket.
*/
+ protected boolean processSocketWithOptions(long socket) {
+ try {
+ if (executor == null) {
+ getWorkerThread().assignWithOptions(socket);
+ } else {
+ executor.execute(new SocketWithOptionsProcessor(socket));
+ }
+ } catch (Throwable t) {
+ // This means we got an OOM or similar creating a thread, or that
+ // the pool and its queue are full
+ log.error(sm.getString("endpoint.process.fail"), t);
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ * Process given socket.
+ */
protected boolean processSocket(long socket) {
try {
if (executor == null) {
@@ -1080,7 +1100,7 @@
// Accept the next incoming connection from the server
socket
long socket = Socket.accept(serverSock);
// Hand this socket off to an appropriate processor
- if (!setSocketOptions(socket) || !processSocket(socket)) {
+ if (!processSocketWithOptions(socket)) {
// Close socket and pool right away
Socket.destroy(socket);
}
@@ -1346,6 +1366,37 @@
protected long socket = 0;
protected boolean event = false;
protected boolean error = false;
+ protected boolean options = false;
+
+
+ /**
+ * Process an incoming TCP/IP connection on the specified socket. Any
+ * exception that occurs during processing must be logged and
swallowed.
+ * <b>NOTE</b>: This method is called from our Connector's thread. We
+ * must assign it to our own thread so that multiple simultaneous
+ * requests can be handled.
+ *
+ * @param socket TCP socket to process
+ */
+ protected synchronized void assignWithOptions(long socket) {
+
+ // Wait for the Processor to get the previous Socket
+ while (available) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ }
+ }
+
+ // Store the newly available Socket and notify our thread
+ this.socket = socket;
+ event = false;
+ error = false;
+ options = true;
+ available = true;
+ notifyAll();
+
+ }
/**
@@ -1371,6 +1422,7 @@
this.socket = socket;
event = false;
error = false;
+ options = false;
available = true;
notifyAll();
@@ -1391,6 +1443,7 @@
this.socket = socket;
event = true;
this.error = error;
+ options = false;
available = true;
notifyAll();
@@ -1440,7 +1493,8 @@
// Close socket and pool
Socket.destroy(socket);
socket = 0;
- } else if ((!event) && (handler.process(socket) ==
Handler.SocketState.CLOSED)) {
+ } else if ((!event) && ((options && !setSocketOptions(socket))
+ || handler.process(socket) ==
Handler.SocketState.CLOSED)) {
// Close socket and pool
Socket.destroy(socket);
socket = 0;
@@ -1830,6 +1884,37 @@
}
+ // ---------------------------------------------- SocketProcessor Inner
Class
+
+
+ /**
+ * This class is the equivalent of the Worker, but will simply use in an
+ * external Executor thread pool. This will also set the socket options
+ * and do the handshake.
+ */
+ protected class SocketWithOptionsProcessor implements Runnable {
+
+ protected long socket = 0;
+
+ public SocketWithOptionsProcessor(long socket) {
+ this.socket = socket;
+ }
+
+ public void run() {
+
+ // Process the request from this socket
+ if (!setSocketOptions(socket)
+ || handler.process(socket) == Handler.SocketState.CLOSED) {
+ // Close socket and pool
+ Socket.destroy(socket);
+ socket = 0;
+ }
+
+ }
+
+ }
+
+
// ---------------------------------------------- SocketProcessor Inner
Class
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=429001&r1=429000&r2=429001&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Sat
Aug 5 06:57:54 2006
@@ -309,7 +309,7 @@
Socket socket =
serverSocketFactory.acceptSocket(serverSocket);
serverSocketFactory.initSocket(socket);
// Hand this socket off to an appropriate processor
- if (!setSocketOptions(socket) || !processSocket(socket)) {
+ if (!processSocket(socket)) {
// Close socket right away
try {
socket.close();
@@ -348,7 +348,7 @@
public void run() {
// Process the request from this socket
- if (!handler.process(socket)) {
+ if (!setSocketOptions(socket) || !handler.process(socket)) {
// Close socket
try {
socket.close();
@@ -441,7 +441,7 @@
continue;
// Process the request from this socket
- if (!handler.process(socket)) {
+ if (!setSocketOptions(socket) || !handler.process(socket)) {
// Close socket
try {
socket.close();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]