This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/7.0.x by this push:
     new 6e0e4d9  Update state definitions and associated diagram (now a lot 
simpler)
6e0e4d9 is described below

commit 6e0e4d992ba4bef6483517726cb87edfde9518e3
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Oct 17 22:51:27 2019 +0100

    Update state definitions and associated diagram (now a lot simpler)
---
 java/org/apache/coyote/AsyncStateMachine.java | 161 ++++++++++++--------------
 1 file changed, 75 insertions(+), 86 deletions(-)

diff --git a/java/org/apache/coyote/AsyncStateMachine.java 
b/java/org/apache/coyote/AsyncStateMachine.java
index 3200fbe..e407edf 100644
--- a/java/org/apache/coyote/AsyncStateMachine.java
+++ b/java/org/apache/coyote/AsyncStateMachine.java
@@ -30,101 +30,90 @@ import org.apache.tomcat.util.security.PrivilegedSetTccl;
  * <pre>
  * The internal states that are used are:
  * DISPATCHED       - Standard request. Not in Async mode.
- * STARTING         - ServletRequest.startAsync() has been called but the
- *                    request in which that call was made has not finished
- *                    processing.
- * STARTED          - ServletRequest.startAsync() has been called and the
- *                    request in which that call was made has finished
- *                    processing.
+ * STARTING         - ServletRequest.startAsync() has been called from
+ *                    Servlet.service() but service() has not exited.
+ * STARTED          - ServletRequest.startAsync() has been called from
+ *                    Servlet.service() and service() has exited.
  * MUST_COMPLETE    - ServletRequest.startAsync() followed by complete() have
  *                    been called during a single Servlet.service() method. The
- *                    complete() will be processed as soon as the request
- *                    finishes.
- * COMPLETE_PENDING - ServletRequest.startAsync() has been called and before 
the
- *                    request in which that call was had finished processing,
- *                    complete() was called for a non-container thread. The
- *                    complete() will be processed as soon as the request
- *                    finishes. This is different to MUST_COMPLETE because of
- *                    differences required to avoid race conditions during 
error
- *                    handling.
+ *                    complete() will be processed as soon as Servlet.service()
+ *                    exits.
+ * COMPLETE_PENDING - ServletRequest.startAsync() has been called from
+ *                    Servlet.service() but, before service() exited, 
complete()
+ *                    was called from another thread. The complete() will
+ *                    be processed as soon as Servlet.service() exits.
  * COMPLETING       - The call to complete() was made once the request was in
- *                    the STARTED state. May or may not be triggered by a
- *                    container thread - depends if start(Runnable) was used.
+ *                    the STARTED state.
  * TIMING_OUT       - The async request has timed out and is waiting for a call
- *                    to complete(). If that isn't made, the error state will
- *                    entered.
+ *                    to complete() or dispatch(). If that isn't made, the 
error
+ *                    state will be entered.
  * MUST_DISPATCH    - ServletRequest.startAsync() followed by dispatch() have
  *                    been called during a single Servlet.service() method. The
- *                    dispatch() will be processed as soon as the request
- *                    finishes.
- * DISPATCH_PENDING - ServletRequest.startAsync() has been called and before 
the
- *                    request in which that call was had finished processing,
- *                    dispatch() was called for a non-container thread. The
- *                    dispatch() will be processed as soon as the request
- *                    finishes. This is different to MUST_DISPATCH because of
- *                    differences required to avoid race conditions during 
error
- *                    handling.
+ *                    dispatch() will be processed as soon as Servlet.service()
+ *                    exits.
+ * DISPATCH_PENDING - ServletRequest.startAsync() has been called from
+ *                    Servlet.service() but, before service() exited, 
dispatch()
+ *                    was called from another thread. The dispatch() will
+ *                    be processed as soon as Servlet.service() exits.
  * DISPATCHING      - The dispatch is being processed.
- * MUST_ERROR       - ServletRequest.startAsync() has been called followed by 
an
- *                    I/O error on a non-container thread. The main purpose of
- *                    this state is to prevent additional async actions
- *                    (complete(), dispatch() etc.) on the non-container 
thread.
- *                    The container will perform the necessary error handling,
- *                    including ensuring that the AsyncLister.onError() method
- *                    is called.
+ * MUST_ERROR       - ServletRequest.startAsync() has been called from
+ *                    Servlet.service() but, before service() exited, an I/O
+ *                    error occured on another thread. The container will
+ *                    perform the necessary error handling when
+ *                    Servlet.service() exits.
  * ERROR            - Something went wrong.
  *
- * |-----------------»------|  
|--«--------MUST_ERROR---------------«------------------------|
- * |                       \|/\|/                                              
              |
- * |   |----------«-----E R R O 
R--«-----------------------«-------------------------------| |
- * |   |      complete() /|\/|\\ \--«---------------------------------«-----|  
            | ^
- * |   |                  |  |  \                                           |  
            | |
- * |   |    |-----»-------|  |   \-----------»----------|                   |  
            | |
- * |   |    |                |                          |dispatch()         |  
            | |
- * |   |    |                |                         \|/                  ^  
            | |
- * |   |    |                |          |--|timeout()   |                   |  
            | |
- * |   |    |     post()     |          | \|/           |     post()        |  
            | |
- * |   |    |    |---------- | --»DISPATCHED«---------- | 
--------------COMPLETING«-----|  | |
- * |   |    |    |           |   /|\/|\ |               |                | /|\ 
/|\      |  | |
- * |   |    |    |    |---»- | ---|  |  |startAsync()   |       timeout()|--|  
 |       |  | |
- * |   |    ^    ^    |      |       |  |               |                      
 |       |  ^ |
- * |   |    |    |    |   |-- \ -----|  |   complete()  |                      
 |post() |  | |
- * |   |    |    |    |   |    \        |     /--»----- | 
---COMPLETE_PENDING-»-|       |  | |
- * |   |    |    |    |   |     \       |    /          |                      
         |  | |
- * |   |    |    |    |   ^      \      |   /           |                      
         |  | |
- * |  \|/   |    |    |   |       \    \|/ /   post()   |                      
         |  | |
- * | MUST_COMPLETE-«- | - | --«----STARTING--»--------- | -------------|       
         ^  | |
- * |         /|\      |   |  complete()  | \            |              |     
complete() |  | |
- * |          |       |   |              |  \           |    post()    |     
/----------|  | |
- * |          |       ^   |    dispatch()|   \          |    |-----|   |    /  
            | |
- * |          |       |   |              |    \         |    |     |   |   /   
            | |
- * |          |       |   |             \|/    \        |    |    \|/ \|/ /    
            | ^
- * |          |       |   |--«--MUST_DISPATCH-----«-----|    
|--«--STARTED---»-------------| |
- * |          |       | dispatched() /|\   |     \                / |     \    
              |
- * |          |       |               |    |      \              /  |      \  
nct-io-error   |
- * |          |       |               |    |       \            /   |       
\----»-----------|
- * |          |       |               |    |post()  \           |   |
- * ^          ^       |               |    |       \|/          |   |
- * |          |       ^               |    |  DISPATCH_PENDING  |   |
- * |          |       |               |    |  |post()           |   |
- * |          |       |               |    |  |      |----------|   |
- * |          |       |               |    |  |      |  dispatch()  |
- * |          |       |               |    |  |      |              |
- * |          |       |post()         |    |  |      |     timeout()|
- * |          |       |dispatched()   |   \|/\|/    \|/             |
- * |          |       |---«---------- | ---DISPATCHING              |
- * |          |                       |     |   /|\                 |
- * |          |                       |     |----|                  |
- * |          |                       |    timeout()                |
- * |          |                       |                             |
- * |          |                       |       dispatch()           \|/
- * |          |                       |-----------«-----------TIMING_OUT
- * |          |                                                 |   |
- * |          |-------«----------------------------------«------|   |
- * |                              complete()                        |
- * |                                                                |
- * |«--------«-------------------«-------------------------------«--|
- *                                 error()
+ *
+ * The valid state transitions are:
+ *
+ *                  post()                                        dispatched()
+ *    |-------»------------------»---------|    
|-------«-----------------------«-----|
+ *    |                                    |    |                              
       |
+ *    |                                    |    |        post()                
       |
+ *    |               post()              \|/  \|/       dispatched()          
       |
+ *    |           
|-----»----------------»DISPATCHED«-------------«-------------|     |
+ *    |           |                          | /|\ |                           
 |     |
+ *    |           |              startAsync()|  |--|timeout()                  
 |     |
+ *    ^           |                          |                                 
 |     |
+ *    |           |        complete()        |                  dispatch()     
 ^     |
+ *    |           |   |--«---------------«-- | ---«--MUST_ERROR--»-----|       
 |     |
+ *    |           |   |                      |         /|\             |       
 |     |
+ *    |           ^   |                      |          |              |       
 |     |
+ *    |           |   |                      |    /-----|error()       |       
 |     |
+ *    |           |   |                      |   /                     |       
 ^     |
+ *    |           |  \|/  ST-complete()     \|/ /   ST-dispatch()     \|/      
 |     |
+ *    |    
MUST_COMPLETE«--------«--------STARTING--------»---------»MUST_DISPATCH    |
+ *    |                                    / | \                               
       |
+ *    |                                   /  |  \                              
       |
+ *    |                    OT-complete() /   |   \    OT-dispatch()            
       |
+ *    |   COMPLETE_PENDING«------«------/    |    
\-------»---------»DISPATCH_PENDING |
+ *    |          |                           |                           |     
       |
+ *    |    post()|   timeout()         post()|   post()            post()|  
timeout() |
+ *    |          |   |--|                    |  |--|                     |    
|--|    |
+ *    |         \|/ \|/ |   complete()      \|/\|/ |   dispatch()       \|/  
\|/ |    |
+ *    
|--«-----COMPLETING«--------«----------STARTED--------»---------»DISPATCHING----|
+ *            /|\  /|\                       |                             /|\ 
/|\
+ *             |    |                        |                              |  
 |
+ *             |    |               timeout()|                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |                        |                              |  
 |
+ *             |    |       complete()      \|/         dispatch()          |  
 |
+ *             |    |------------«-------TIMING_OUT--------»----------------|  
 |
+ *             |                                                               
 |
+ *             |            complete()                     dispatch()          
 |
+ *             
|---------------«-----------ERROR--------------»-----------------|
+ *
+ *
+ * Notes: * For clarity, the transitions to ERROR which are valid from every 
state apart from
+ *          STARTING are not shown.
+ *        * All transitions may happen on either the Servlet.service() thread 
(ST) or on any
+ *          other thread (OT) unless explicitly marked.
  * </pre>
  */
 public class AsyncStateMachine<S> {


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to