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

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


The following commit(s) were added to refs/heads/master by this push:
     new a417690  Re-work fix for complete()/dispatch() when in READ_WRITE state
a417690 is described below

commit a417690be308ca145a8b5b61f0260a4f713ea331
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Mar 25 17:52:24 2021 +0000

    Re-work fix for complete()/dispatch() when in READ_WRITE state
    
    Previous fix only addressed dispatch. Mirror changes to complete().
    The *_PENDING states are only required if the complete()/dispatch() is
    performed on a non-container thread. If on a container thread the race
    condition cannot occur.
---
 java/org/apache/coyote/AsyncStateMachine.java | 37 +++++++++++++++------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/java/org/apache/coyote/AsyncStateMachine.java 
b/java/org/apache/coyote/AsyncStateMachine.java
index 4cc194e..3176246 100644
--- a/java/org/apache/coyote/AsyncStateMachine.java
+++ b/java/org/apache/coyote/AsyncStateMachine.java
@@ -91,19 +91,23 @@ import org.apache.tomcat.util.security.PrivilegedSetTccl;
  *    |                                   /  |  \                              
       |
  *    |                    OT-complete() /   |   \    OT-dispatch()            
       |
  *    |   COMPLETE_PENDING«------«------/    |    
\-------»---------»DISPATCH_PENDING |
- *    |          |    /|\                    |                       /|\ |     
       |
- *    |          |     |                     |                        |  
|post()      |
- *    |          |     |complete()           |              dispatch()|  |     
       |
- *    |          |     |                     |                        |  |     
       |
- *    |          |     |---------«-------«-- | --«---READ_WRITE--»----|  |     
       |
- *    |          |                           |        /  /|\             |     
       |
- *    |          |                           | post()/   /               |     
       |
- *    |          |                           |      /   /                |     
       |
- *    |          |                           |     /   /                 |     
       |
- *    |          |                           |    /   /                  |     
       |
- *    |    post()|   timeout()         post()|   /   /asyncOperation()   |  
timeout() |
- *    |          |   |--|                    |   |  /                    |    
|--|    |
- *    |         \|/ \|/ |   complete()      \|/ \|//   dispatch()       \|/  
\|/ |    |
+ *    |        |      /|\                    |                       /|\ |     
       |
+ *    |        |       |                     |                        |  
|post()      |
+ *    |        |       |OT-complete()        |           OT-dispatch()|  |     
       |
+ *    |        |       |---------«-------«---|---«--\                 |  |     
       |
+ *    |        |                             |       \                |  |     
       |
+ *    |        |         /-------«-------«-- | --«---READ_WRITE--»----|  |     
       |
+ *    |        |        / ST-complete()      |        /  /|\  \          |     
       |
+ *    |        |       /                     | post()/   /     \         |     
       |
+ *    |        |      /                      |      /   /       \        |     
       |
+ *    |        |     /                       |     /   /         \       |     
       |
+ *    |        |    /                        |    /   /           \      |     
       |
+ *    |        |   /                         |   |   /             \     |     
       |
+ *    |        |  /                          |   |  /  ST-dispatch()\    |     
       |
+ *    |        |  |                          |   | |                 \   |     
       |
+ *    |  post()|  |  timeout()         post()|   | |asyncOperation()  \  |  
timeout() |
+ *    |        |  |  |--|                    |   | |                  |  |    
|--|    |
+ *    |       \|/\|/\|/ |     complete()    \|/ \|/|   dispatch()    \|/\|/  
\|/ |    |
  *    
|--«-----COMPLETING«--------«----------STARTED--------»---------»DISPATCHING----|
  *            /|\  /|\                       | /|\ |                       /|\ 
/|\
  *             |    |                        |  |--|                        |  
 |
@@ -301,7 +305,8 @@ class AsyncStateMachine {
 
 
     synchronized boolean asyncComplete() {
-        if (!ContainerThreadMarker.isContainerThread() && state == 
AsyncState.STARTING) {
+        if (!ContainerThreadMarker.isContainerThread() &&
+                (state == AsyncState.STARTING || state == 
AsyncState.READ_WRITE_OP)) {
             updateState(AsyncState.COMPLETE_PENDING);
             return false;
         }
@@ -362,8 +367,8 @@ class AsyncStateMachine {
 
 
     synchronized boolean asyncDispatch() {
-        if (!ContainerThreadMarker.isContainerThread() && state == 
AsyncState.STARTING ||
-                state == AsyncState.READ_WRITE_OP) {
+        if (!ContainerThreadMarker.isContainerThread() &&
+                (state == AsyncState.STARTING || state == 
AsyncState.READ_WRITE_OP)) {
             updateState(AsyncState.DISPATCH_PENDING);
             return false;
         }

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

Reply via email to