Author: remm Date: Wed Feb 3 10:23:33 2016 New Revision: 1728292 URL: http://svn.apache.org/viewvc?rev=1728292&view=rev Log: - Pull default "unsupported" async methods implementation up, since it looks unlikely it ever makes sense to use them with APR or NIO. - Add some new helpers. It is possible that I'll add some sync oriented helpers, but unsure yet.
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1728292&r1=1728291&r2=1728292&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed Feb 3 10:23:33 2016 @@ -20,7 +20,6 @@ import java.io.EOFException; import java.io.IOException; import java.net.SocketTimeoutException; import java.nio.ByteBuffer; -import java.nio.channels.CompletionHandler; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -30,7 +29,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; @@ -2635,12 +2633,6 @@ public class AprEndpoint extends Abstrac @Override - public boolean isReadPending() { - return false; - } - - - @Override public void registerReadInterest() { // Make sure an already closed socket is not added to the poller synchronized (closedLock) { @@ -2793,30 +2785,5 @@ public class AprEndpoint extends Abstrac SSLSocket.setVerify(socket, SSL.SSL_CVERIFY_REQUIRE, -1); SSLSocket.renegotiate(socket); } - - - @Override - public boolean isWritePending() { - return false; - } - - - @Override - 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) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); - } - - @Override - 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) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); - } } } 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=1728292&r1=1728291&r2=1728292&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Wed Feb 3 10:23:33 2016 @@ -1107,6 +1107,9 @@ public class Nio2Endpoint extends Abstra } else { throw new ReadPendingException(); } + if (block && state.state == CompletionState.PENDING && readPending.tryAcquire(timeout, unit)) { + readPending.release(); + } } catch (InterruptedException e) { handler.failed(e, attachment); } @@ -1337,6 +1340,32 @@ public class Nio2Endpoint extends Abstra } } + + @Override + public boolean awaitReadComplete(long timeout, TimeUnit unit) { + try { + if (readPending.tryAcquire(timeout, unit)) { + readPending.release(); + } + } catch (InterruptedException e) { + return false; + } + return true; + } + + + @Override + public boolean awaitWriteComplete(long timeout, TimeUnit unit) { + try { + if (writePending.tryAcquire(timeout, unit)) { + writePending.release(); + } + } catch (InterruptedException e) { + return false; + } + return true; + } + /* * This should only be called from a thread that currently holds a lock * on the socket. This prevents a race condition between a pending read Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1728292&r1=1728291&r2=1728292&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Wed Feb 3 10:23:33 2016 @@ -27,7 +27,6 @@ import java.net.Socket; import java.net.SocketTimeoutException; import java.nio.ByteBuffer; import java.nio.channels.CancelledKeyException; -import java.nio.channels.CompletionHandler; import java.nio.channels.FileChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -1315,12 +1314,6 @@ public class NioEndpoint extends Abstrac @Override - public boolean isReadPending() { - return false; - } - - - @Override public void registerReadInterest() { getPoller().add(getSocket(), SelectionKey.OP_READ); } @@ -1430,29 +1423,6 @@ public class NioEndpoint extends Abstrac } } } - - @Override - public boolean isWritePending() { - return false; - } - - @Override - 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) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); - } - - @Override - 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) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); - } } 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=1728292&r1=1728291&r2=1728292&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Wed Feb 3 10:23:33 2016 @@ -208,8 +208,6 @@ public abstract class SocketWrapperBase< return blockingStatusWriteLock; } public SocketBufferHandler getSocketBufferHandler() { return socketBufferHandler; } - public abstract boolean isReadPending(); - public abstract boolean isWritePending(); public boolean hasDataToWrite() { return !socketBufferHandler.isWriteBufferEmpty() || bufferedWrites.size() > 0; @@ -660,6 +658,52 @@ public abstract class SocketWrapperBase< } /** + * Allows checking if an asynchronous read operation is currently pending. + * @return <code>true</code> if the endpoint supports asynchronous IO and + * a read operation is being processed asynchronously + */ + public boolean isReadPending() { + return false; + } + + /** + * Allows checking if an asynchronous write operation is currently pending. + * @return <code>true</code> if the endpoint supports asynchronous IO and + * a write operation is being processed asynchronously + */ + public boolean isWritePending() { + return false; + } + + /** + * If an asynchronous read operation is pending, this method will block + * until the operation completes, or the specified amount of time + * has passed. + * @param timeout The maximum amount of time to wait + * @param unit The unit for the timeout + * @return <code>true</code> if the read operation is complete, + * <code>false</code> if the operation is still pending and + * the specified timeout has passed + */ + public boolean awaitReadComplete(long timeout, TimeUnit unit) { + return true; + } + + /** + * If an asynchronous write operation is pending, this method will block + * until the operation completes, or the specified amount of time + * has passed. + * @param timeout The maximum amount of time to wait + * @param unit The unit for the timeout + * @return <code>true</code> if the read operation is complete, + * <code>false</code> if the operation is still pending and + * the specified timeout has passed + */ + public boolean awaitWriteComplete(long timeout, TimeUnit unit) { + return true; + } + + /** * Scatter read. The completion handler will be called once some * data has been read or an error occurred. If a CompletionCheck * object has been provided, the completion handler will only be @@ -683,7 +727,7 @@ public abstract class SocketWrapperBase< * @param <A> The attachment type * @return the completion state (done, done inline, or still pending) */ - public <A> CompletionState read(boolean block, long timeout, TimeUnit unit, A attachment, + public final <A> CompletionState read(boolean block, long timeout, TimeUnit unit, A attachment, CompletionCheck check, CompletionHandler<Long, ? super A> handler, ByteBuffer... dsts) { if (dsts == null) { @@ -718,9 +762,11 @@ public abstract class SocketWrapperBase< * @param <A> The attachment type * @return the completion state (done, done inline, or still pending) */ - public abstract <A> CompletionState read(ByteBuffer[] dsts, int offset, int length, + 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); + CompletionCheck check, CompletionHandler<Long, ? super A> handler) { + throw new UnsupportedOperationException(); + } /** * Gather write. The completion handler will be called once some @@ -747,7 +793,7 @@ public abstract class SocketWrapperBase< * @param <A> The attachment type * @return the completion state (done, done inline, or still pending) */ - public <A> CompletionState write(boolean block, long timeout, TimeUnit unit, A attachment, + public final <A> CompletionState write(boolean block, long timeout, TimeUnit unit, A attachment, CompletionCheck check, CompletionHandler<Long, ? super A> handler, ByteBuffer... srcs) { if (srcs == null) { @@ -783,9 +829,11 @@ public abstract class SocketWrapperBase< * @param <A> The attachment type * @return the completion state (done, done inline, or still pending) */ - public abstract <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); + CompletionCheck check, CompletionHandler<Long, ? super A> handler) { + throw new UnsupportedOperationException(); + } // --------------------------------------------------------- Utility methods --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org