From a1605fc956ba00f5991366e36daaaf4d69e89886 Mon Sep 17 00:00:00 2001 From: fhanik Date: Wed, 5 Aug 2009 21:16:47 +0000 Subject: [PATCH] more work on the complete git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@801414 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/connector/AsyncContextImpl.java | 18 +++++++++++++++--- java/org/apache/coyote/http11/Http11NioProcessor.java | 8 ++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/java/org/apache/catalina/connector/AsyncContextImpl.java b/java/org/apache/catalina/connector/AsyncContextImpl.java index 5526d4916..caaa3b1b6 100644 --- a/java/org/apache/catalina/connector/AsyncContextImpl.java +++ b/java/org/apache/catalina/connector/AsyncContextImpl.java @@ -19,6 +19,7 @@ package org.apache.catalina.connector; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import javax.servlet.AsyncContext; @@ -35,6 +36,7 @@ import org.apache.catalina.Context; import org.apache.coyote.ActionCode; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.MutableInteger; /** * * @author fhanik @@ -65,8 +67,12 @@ public class AsyncContextImpl implements AsyncContext { @Override public void complete() { - // TODO SERVLET3 - async - doInternalComplete(false); + if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) { + // TODO SERVLET3 - async + AtomicBoolean dispatched = new AtomicBoolean(false); + request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched); + if (!dispatched.get()) doInternalComplete(false); + } } @Override @@ -221,9 +227,15 @@ public class AsyncContextImpl implements AsyncContext { public void doInternalDispatch() throws ServletException, IOException { if (this.state.compareAndSet(AsyncState.TIMING_OUT, AsyncState.DISPATCHED)) { + boolean listenerInvoked = false; for (AsyncListenerWrapper listener : listeners) { listener.fireOnTimeout(); + listenerInvoked = true; + } + if (!listenerInvoked) { + ((HttpServletResponse)servletResponse).setStatus(500); } + doInternalComplete(true); } else if (this.state.compareAndSet(AsyncState.DISPATCHING, AsyncState.DISPATCHED)) { if (this.dispatch!=null) { try { @@ -264,8 +276,8 @@ public class AsyncContextImpl implements AsyncContext { }catch (Exception x) { log.error("",x); } - request.coyoteRequest.action(ActionCode.ACTION_ASYNC_COMPLETE,null); recycle(); + } else { throw new IllegalStateException("Complete illegal. Invalid state:"+state.get()); } diff --git a/java/org/apache/coyote/http11/Http11NioProcessor.java b/java/org/apache/coyote/http11/Http11NioProcessor.java index 8e4e4d416..266692ab0 100644 --- a/java/org/apache/coyote/http11/Http11NioProcessor.java +++ b/java/org/apache/coyote/http11/Http11NioProcessor.java @@ -22,6 +22,7 @@ import java.io.InterruptedIOException; import java.net.InetAddress; import java.nio.channels.SelectionKey; import java.util.StringTokenizer; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -1314,10 +1315,13 @@ public class Http11NioProcessor implements ActionHook { async = true; } else if (actionCode == ActionCode.ACTION_ASYNC_COMPLETE) { //TODO SERVLET3 - async + AtomicBoolean dispatch = (AtomicBoolean)param; asyncClose = true; RequestInfo rp = request.getRequestProcessor(); - if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) //async handling - socket.getPoller().cometInterest(socket); + if ( rp.getStage() != org.apache.coyote.Constants.STAGE_SERVICE ) { //async handling + dispatch.set(true); + endpoint.processSocket(this.socket, SocketStatus.STOP, true); + } } else if (actionCode == ActionCode.ACTION_ASYNC_SETTIMEOUT) { //TODO SERVLET3 - async if (param==null) return; -- 2.11.0