Author: markt
Date: Sun Oct 6 21:59:06 2013
New Revision: 1529702
URL: http://svn.apache.org/r1529702
Log:
No need to test dispatches.hasNext() more than once.
Add some additional comments.
Modified:
tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java
tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1529702&r1=1529701&r2=1529702&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Sun Oct 6
21:59:06 2013
@@ -620,16 +620,12 @@ public abstract class AbstractProtocol<S
Iterator<DispatchType> dispatches = null;
do {
if (dispatches != null) {
- if (dispatches.hasNext()) {
- // Associate with the processor with the
connection as
- // these calls may result in a nested call to
process()
- connections.put(socket, processor);
- DispatchType nextDispatch = dispatches.next();
- state = processor.asyncDispatch(
- nextDispatch.getSocketStatus());
- } else {
- dispatches = null;
- }
+ // Associate with the processor with the connection as
+ // these calls may result in a nested call to process()
+ connections.put(socket, processor);
+ DispatchType nextDispatch = dispatches.next();
+ state = processor.asyncDispatch(
+ nextDispatch.getSocketStatus());
} else if (status == SocketStatus.DISCONNECT &&
!processor.isComet()) {
// Do nothing here, just wait for it to get recycled
@@ -677,11 +673,13 @@ public abstract class AbstractProtocol<S
"], State out: [" + state + "]");
}
if (dispatches == null || !dispatches.hasNext()) {
+ // Only returns non-null iterator if there are
+ // dispatches to process.
dispatches = wrapper.getIteratorAndClearDispatches();
}
} while (state == SocketState.ASYNC_END ||
state == SocketState.UPGRADING ||
- dispatches != null && dispatches.hasNext() && state !=
SocketState.CLOSED);
+ dispatches != null && state != SocketState.CLOSED);
if (state == SocketState.LONG) {
// In the middle of processing a request/response. Keep the
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java?rev=1529702&r1=1529701&r2=1529702&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapper.java Sun Oct 6
21:59:06 2013
@@ -119,8 +119,13 @@ public class SocketWrapper<E> {
}
}
public Iterator<DispatchType> getIteratorAndClearDispatches() {
+ // Note: Logic in AbstractProtocol depends on this method only
returning
+ // a non-null value if the iterator is non-empty. i.e. it should never
+ // return an empty iterator.
Iterator<DispatchType> result;
synchronized (dispatches) {
+ // Synchronized as the generation of the iterator and the clearing
+ // of dispatches needs to be an atomic operation.
result = dispatches.iterator();
if (result.hasNext()) {
dispatches.clear();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]