Author: remm
Date: Sat Mar 4 11:46:44 2017
New Revision: 1785467
URL: http://svn.apache.org/viewvc?rev=1785467&view=rev
Log:
Continue some casual experimentation with HTTP/2. Apparently there is a
"deadlock" with reads in some cases [like when shutting down and there's a
blocked read, it's visible with the testsuite; I'll work on it].
Modified:
tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1785467&r1=1785466&r2=1785467&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Sat Mar 4
11:46:44 2017
@@ -31,8 +31,6 @@ import java.nio.channels.ClosedChannelEx
import java.nio.channels.CompletionHandler;
import java.nio.channels.FileChannel;
import java.nio.channels.NetworkChannel;
-import java.nio.channels.ReadPendingException;
-import java.nio.channels.WritePendingException;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
@@ -834,7 +832,7 @@ public class Nio2Endpoint extends Abstra
@Override
public boolean hasAsyncIO() {
- return false;
+ return true;
}
/**
@@ -975,20 +973,30 @@ public class Nio2Endpoint extends Abstra
public <A> CompletionState read(ByteBuffer[] dsts, int offset, int
length,
boolean block, long timeout, TimeUnit unit, A attachment,
CompletionCheck check, CompletionHandler<Long, ? super A>
handler) {
- OperationState<A> state = new OperationState<>(dsts, offset,
length, timeout, unit, attachment, check, handler);
- try {
- if ((!block && readPending.tryAcquire()) || (block &&
readPending.tryAcquire(timeout, unit))) {
- Nio2Endpoint.startInline();
- getSocket().read(dsts, offset, length, timeout, unit,
state, new ScatterReadCompletionHandler<>());
- Nio2Endpoint.endInline();
- } else {
- throw new ReadPendingException();
+ if (block) {
+ try {
+ if (!readPending.tryAcquire(timeout, unit)) {
+ handler.failed(new SocketTimeoutException(),
attachment);
+ return CompletionState.ERROR;
+ }
+ } catch (InterruptedException e) {
+ handler.failed(e, attachment);
+ return CompletionState.ERROR;
}
- if (block && state.state == CompletionState.PENDING &&
readPending.tryAcquire(timeout, unit)) {
- readPending.release();
+ } else {
+ if (!readPending.tryAcquire()) {
+ return CompletionState.NOT_DONE;
+ }
+ }
+ OperationState<A> state = new OperationState<>(dsts, offset,
length, timeout, unit, attachment, check, handler);
+ Nio2Endpoint.startInline();
+ getSocket().read(dsts, offset, length, timeout, unit, state, new
ScatterReadCompletionHandler<>());
+ Nio2Endpoint.endInline();
+ if (block && state.state == CompletionState.PENDING) {
+ if (!awaitReadComplete(timeout, unit)) {
+ handler.failed(new SocketTimeoutException(), attachment);
+ return CompletionState.ERROR;
}
- } catch (InterruptedException e) {
- handler.failed(e, attachment);
}
return state.state;
}
@@ -1001,24 +1009,28 @@ public class Nio2Endpoint extends Abstra
}
@Override
- public <A> CompletionState write(ByteBuffer[] srcs, int offset, int
length,
+ public <A> CompletionState write(ByteBuffer[] srcs, int offset, int
length,
boolean block, long timeout, TimeUnit unit, A attachment,
CompletionCheck check, CompletionHandler<Long, ? super A>
handler) {
- OperationState<A> state = new OperationState<>(srcs, offset,
length, timeout, unit, attachment, check, handler);
- try {
- if ((!block && writePending.tryAcquire()) || (block &&
writePending.tryAcquire(timeout, unit))) {
- Nio2Endpoint.startInline();
- getSocket().write(srcs, offset, length, timeout, unit,
state, new GatherWriteCompletionHandler<>());
- Nio2Endpoint.endInline();
- } else {
- throw new WritePendingException();
+ if (block) {
+ try {
+ if (!writePending.tryAcquire(timeout, unit)) {
+ handler.failed(new SocketTimeoutException(),
attachment);
+ return CompletionState.ERROR;
+ }
+ } catch (InterruptedException e) {
+ handler.failed(e, attachment);
+ return CompletionState.ERROR;
}
- if (block && state.state == CompletionState.PENDING &&
writePending.tryAcquire(timeout, unit)) {
- writePending.release();
+ } else {
+ if (!writePending.tryAcquire()) {
+ return CompletionState.NOT_DONE;
}
- } catch (InterruptedException e) {
- handler.failed(e, attachment);
}
+ OperationState<A> state = new OperationState<>(srcs, offset,
length, timeout, unit, attachment, check, handler);
+ Nio2Endpoint.startInline();
+ getSocket().write(srcs, offset, length, timeout, unit, state, new
GatherWriteCompletionHandler<>());
+ Nio2Endpoint.endInline();
return state.state;
}
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1785467&r1=1785466&r2=1785467&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Sat Mar
4 11:46:44 2017
@@ -770,6 +770,10 @@ public abstract class SocketWrapperBase<
*/
PENDING,
/**
+ * Operation was pending and non blocking.
+ */
+ NOT_DONE,
+ /**
* The operation completed inline.
*/
INLINE,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]