This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push:
new 67638c17e7 Fix backport of BZ 66508 regression fix
67638c17e7 is described below
commit 67638c17e7c19a0280ccafa340183fb179af92f5
Author: Mark Thomas <[email protected]>
AuthorDate: Thu Jan 18 18:52:30 2024 +0000
Fix backport of BZ 66508 regression fix
---
.../server/WsRemoteEndpointImplServer.java | 61 +++++++++++-----------
1 file changed, 31 insertions(+), 30 deletions(-)
diff --git
a/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
b/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
index d0cfef46ac..3be5d4f382 100644
--- a/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
+++ b/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
@@ -107,42 +107,43 @@ public class WsRemoteEndpointImplServer extends
WsRemoteEndpointImplBase {
* Special handling is required only when all of the following are
true:
* - A close message is being sent
* - This thread currently holds the socketWrapper lock (i.e. the
thread is current processing a socket event)
+ *
+ * Special handling is only possible if the socketWrapper lock is a
ReentrantLock (it will be by default)
*/
- if (!(opCode == Constants.OPCODE_CLOSE &&
socketWrapper.getLock().isHeldByCurrentThread())) {
- // Skip special handling
- return super.acquireMessagePartInProgressSemaphore(opCode,
timeoutExpiry);
- }
-
- int socketWrapperLockCount;
if (socketWrapper.getLock() instanceof ReentrantLock) {
- socketWrapperLockCount = ((ReentrantLock)
socketWrapper.getLock()).getHoldCount();
- } else {
- socketWrapperLockCount = 1;
- }
- while (!messagePartInProgress.tryAcquire()) {
- if (timeoutExpiry < System.currentTimeMillis()) {
- return false;
- }
- try {
- // Release control of the processor
- socketWrapper.setCurrentProcessor(connection);
- // Release the per socket lock(s)
- for (int i = 0; i < socketWrapperLockCount; i++) {
- socketWrapper.getLock().unlock();
- }
- // Provide opportunity for another thread to obtain the
socketWrapper lock
- Thread.yield();
- } finally {
- // Re-obtain the per socket lock(s)
- for (int i = 0; i < socketWrapperLockCount; i++) {
- socketWrapper.getLock().lock();
+ ReentrantLock reentrantLock = (ReentrantLock)
socketWrapper.getLock();
+ if (opCode == Constants.OPCODE_CLOSE &&
reentrantLock.isHeldByCurrentThread()) {
+ int socketWrapperLockCount = reentrantLock.getHoldCount();
+
+ while (!messagePartInProgress.tryAcquire()) {
+ if (timeoutExpiry < System.currentTimeMillis()) {
+ return false;
+ }
+ try {
+ // Release control of the processor
+ socketWrapper.setCurrentProcessor(connection);
+ // Release the per socket lock(s)
+ for (int i = 0; i < socketWrapperLockCount; i++) {
+ socketWrapper.getLock().unlock();
+ }
+ // Provide opportunity for another thread to obtain
the socketWrapper lock
+ Thread.yield();
+ } finally {
+ // Re-obtain the per socket lock(s)
+ for (int i = 0; i < socketWrapperLockCount; i++) {
+ socketWrapper.getLock().lock();
+ }
+ // Re-take control of the processor
+ socketWrapper.takeCurrentProcessor();
+ }
}
- // Re-take control of the processor
- socketWrapper.takeCurrentProcessor();
+
+ return true;
}
}
- return true;
+ // Skip special handling
+ return super.acquireMessagePartInProgressSemaphore(opCode,
timeoutExpiry);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]