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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]