Author: remm Date: Tue Apr 14 20:58:24 2015 New Revision: 1673555 URL: http://svn.apache.org/r1673555 Log: - Remove read/write pending flags since they don't really add anything, use a lot of finally and are still slightly incorrect without additional finally (or similar). - Simplify, harmonize and cleanups.
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java?rev=1673555&r1=1673554&r2=1673555&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SecureNio2Channel.java Tue Apr 14 20:58:24 2015 @@ -65,8 +65,6 @@ public class SecureNio2Channel extends N protected boolean closed; protected boolean closing; - protected volatile boolean readPending; - protected volatile boolean writePending; private CompletionHandler<Integer, SocketWrapperBase<Nio2Channel>> handshakeReadCompletionHandler; private CompletionHandler<Integer, SocketWrapperBase<Nio2Channel>> handshakeWriteCompletionHandler; @@ -123,15 +121,13 @@ public class SecureNio2Channel extends N handshakeComplete = false; closed = false; closing = false; - readPending = false; - writePending = false; } private class FutureFlush implements Future<Boolean> { private Future<Integer> integer; - protected FutureFlush(Future<Integer> integer) { - this.integer = integer; + protected FutureFlush() { + integer = sc.write(netOutBuffer); } @Override public boolean cancel(boolean mayInterruptIfRunning) { @@ -148,23 +144,13 @@ public class SecureNio2Channel extends N @Override public Boolean get() throws InterruptedException, ExecutionException { - try { - int result = integer.get().intValue(); - return Boolean.valueOf(result >= 0); - } finally { - writePending = false; - } + return Boolean.valueOf(integer.get().intValue() >= 0); } @Override public Boolean get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - try { - int result = integer.get(timeout, unit).intValue(); - return Boolean.valueOf(result >= 0); - } finally { - writePending = false; - } + return Boolean.valueOf(integer.get(timeout, unit).intValue() >= 0); } } @@ -176,12 +162,7 @@ public class SecureNio2Channel extends N */ @Override public Future<Boolean> flush() { - if (writePending) { - throw new WritePendingException(); - } else { - writePending = true; - } - return new FutureFlush(sc.write(netOutBuffer)); + return new FutureFlush(); } /** @@ -558,7 +539,6 @@ public class SecureNio2Channel extends N } @Override public boolean cancel(boolean mayInterruptIfRunning) { - readPending = false; return integer.cancel(mayInterruptIfRunning); } @Override @@ -571,21 +551,13 @@ public class SecureNio2Channel extends N } @Override public Integer get() throws InterruptedException, ExecutionException { - try { - return unwrap(integer.get().intValue()); - } finally { - readPending = false; - } + return unwrap(integer.get().intValue()); } @Override public Integer get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - try { - return unwrap(integer.get(timeout, unit).intValue()); - } finally { - readPending = false; - } + return unwrap(integer.get(timeout, unit).intValue()); } private Integer unwrap(int nRead) throws ExecutionException { //are we in the middle of closing or closed? @@ -647,11 +619,6 @@ public class SecureNio2Channel extends N if (!handshakeComplete) { throw new IllegalStateException(sm.getString("channel.nio.ssl.incompleteHandshake")); } - if (readPending) { - throw new ReadPendingException(); - } else { - readPending = true; - } return new FutureRead(dst); } @@ -665,13 +632,12 @@ public class SecureNio2Channel extends N //are we closing or closed? if (closing || closed) { t = new IOException(sm.getString("channel.nio.ssl.closing")); - return; + } else { + wrap(); } - wrap(); } @Override public boolean cancel(boolean mayInterruptIfRunning) { - writePending = false; return integer.cancel(mayInterruptIfRunning); } @Override @@ -685,7 +651,6 @@ public class SecureNio2Channel extends N @Override public Integer get() throws InterruptedException, ExecutionException { if (t != null) { - writePending = false; throw new ExecutionException(t); } if (integer.get().intValue() > 0 && written == 0) { @@ -695,7 +660,6 @@ public class SecureNio2Channel extends N integer = sc.write(netOutBuffer); return get(); } else { - writePending = false; return Integer.valueOf(written); } } @@ -704,7 +668,6 @@ public class SecureNio2Channel extends N throws InterruptedException, ExecutionException, TimeoutException { if (t != null) { - writePending = false; throw new ExecutionException(t); } if (integer.get(timeout, unit).intValue() > 0 && written == 0) { @@ -714,7 +677,6 @@ public class SecureNio2Channel extends N integer = sc.write(netOutBuffer); return get(timeout, unit); } else { - writePending = false; return Integer.valueOf(written); } } @@ -747,11 +709,6 @@ public class SecureNio2Channel extends N */ @Override public Future<Integer> write(ByteBuffer src) { - if (writePending) { - throw new WritePendingException(); - } else { - writePending = true; - } return new FutureWrite(src); } @@ -767,11 +724,6 @@ public class SecureNio2Channel extends N if (!handshakeComplete) { throw new IllegalStateException(sm.getString("channel.nio.ssl.incompleteHandshake")); } - if (readPending) { - throw new ReadPendingException(); - } else { - readPending = true; - } sc.read(netInBuffer, timeout, unit, attachment, new CompletionHandler<Integer, A>() { @Override public void completed(Integer nBytes, A attach) { @@ -812,7 +764,6 @@ public class SecureNio2Channel extends N } } while ((netInBuffer.position() != 0)); //continue to unwrapping as long as the input buffer has stuff // If everything is OK, so complete - readPending = false; handler.completed(Integer.valueOf(read), attach); } catch (Exception e) { failed(e, attach); @@ -821,7 +772,6 @@ public class SecureNio2Channel extends N } @Override public void failed(Throwable exc, A attach) { - readPending = false; handler.failed(exc, attach); } }); @@ -834,16 +784,12 @@ public class SecureNio2Channel extends N if (offset < 0 || dsts == null || (offset + length) > dsts.length) { throw new IllegalArgumentException(); } - ByteBuffer dst = null; - // Find the first buffer with space - for (int i = 0; i < length; i++) { - ByteBuffer current = dsts[offset + i]; - if (current.position() < current.limit()) { - dst = current; - } + if (closing || closed) { + handler.completed(Long.valueOf(-1), attachment); + return; } - if (dst == null) { - throw new IllegalArgumentException(); + if (!handshakeComplete) { + throw new IllegalStateException(sm.getString("channel.nio.ssl.incompleteHandshake")); } sc.read(netInBuffer, timeout, unit, attachment, new CompletionHandler<Integer, A>() { @Override @@ -885,7 +831,6 @@ public class SecureNio2Channel extends N } } while ((netInBuffer.position() != 0)); //continue to unwrapping as long as the input buffer has stuff // If everything is OK, so complete - readPending = false; handler.completed(Long.valueOf(read), attach); } catch (Exception e) { failed(e, attach); @@ -894,7 +839,6 @@ public class SecureNio2Channel extends N } @Override public void failed(Throwable exc, A attach) { - readPending = false; handler.failed(exc, attach); } }); @@ -909,12 +853,6 @@ public class SecureNio2Channel extends N handler.failed(new IOException(sm.getString("channel.nio.ssl.closing")), attachment); return; } - if (writePending) { - throw new WritePendingException(); - } else { - writePending = true; - } - try { // Prepare the output buffer netOutBuffer.clear(); @@ -937,18 +875,15 @@ public class SecureNio2Channel extends N sc.write(netOutBuffer, timeout, unit, attachment, this); } else if (written == 0) { // Special case, start over to avoid code duplication - writePending = false; write(src, timeout, unit, attachment, handler); } else { // Call the handler completed method with the // consumed bytes number - writePending = false; handler.completed(Integer.valueOf(written), attach); } } @Override public void failed(Throwable exc, A attach) { - writePending = false; handler.failed(exc, attach); } }); @@ -956,7 +891,6 @@ public class SecureNio2Channel extends N throw new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus())); } } catch (Exception e) { - writePending = false; handler.failed(e, attachment); } } @@ -965,19 +899,14 @@ public class SecureNio2Channel extends N public <A> void write(ByteBuffer[] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler) { - // Check state if ((offset < 0) || (length < 0) || (offset > srcs.length - length)) { throw new IndexOutOfBoundsException(); } + // Check state if (closing || closed) { handler.failed(new IOException(sm.getString("channel.nio.ssl.closing")), attachment); return; } - if (writePending) { - throw new WritePendingException(); - } else { - writePending = true; - } try { // Prepare the output buffer netOutBuffer.clear(); @@ -999,18 +928,15 @@ public class SecureNio2Channel extends N sc.write(netOutBuffer, timeout, unit, attachment, this); } else if (written == 0) { // Special case, start over to avoid code duplication - writePending = false; write(srcs, offset, length, timeout, unit, attachment, handler); } else { // Call the handler completed method with the // consumed bytes number - writePending = false; handler.completed(Long.valueOf(written), attach); } } @Override public void failed(Throwable exc, A attach) { - writePending = false; handler.failed(exc, attach); } }); @@ -1018,7 +944,6 @@ public class SecureNio2Channel extends N throw new IOException(sm.getString("channel.nio.ssl.wrapFail", result.getStatus())); } } catch (Exception e) { - writePending = false; handler.failed(e, attachment); } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org