A fix for DIRMINA-994. The ConnectFuture.cancel() method now return a flag telling if the cancellation was already done or not. We don't add a cancelled future into the cancel queue anymore.
Project: http://git-wip-us.apache.org/repos/asf/mina/repo Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/f1972fc3 Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/f1972fc3 Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/f1972fc3 Branch: refs/heads/2.0 Commit: f1972fc3de8c4074ff7b60f8c557d3c53013e30b Parents: 32945a9 Author: Emmanuel Lécharny <[email protected]> Authored: Tue Nov 4 14:22:15 2014 +0100 Committer: Emmanuel Lécharny <[email protected]> Committed: Tue Nov 4 14:22:15 2014 +0100 ---------------------------------------------------------------------- .../apache/mina/core/future/ConnectFuture.java | 5 ++++- .../mina/core/future/DefaultConnectFuture.java | 4 ++-- .../mina/core/future/DefaultIoFuture.java | 8 +++++-- .../polling/AbstractPollingIoConnector.java | 22 +++++++++++++++----- 4 files changed, 29 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina/blob/f1972fc3/mina-core/src/main/java/org/apache/mina/core/future/ConnectFuture.java ---------------------------------------------------------------------- diff --git a/mina-core/src/main/java/org/apache/mina/core/future/ConnectFuture.java b/mina-core/src/main/java/org/apache/mina/core/future/ConnectFuture.java index 2db17c3..a1bc093 100644 --- a/mina-core/src/main/java/org/apache/mina/core/future/ConnectFuture.java +++ b/mina-core/src/main/java/org/apache/mina/core/future/ConnectFuture.java @@ -85,8 +85,11 @@ public interface ConnectFuture extends IoFuture { /** * Cancels the connection attempt and notifies all threads waiting for * this future. + * + * @return {@code true} if the future has been cancelled by this call, {@code false} + * if the future was already cancelled. */ - void cancel(); + boolean cancel(); /** * {@inheritDoc} http://git-wip-us.apache.org/repos/asf/mina/blob/f1972fc3/mina-core/src/main/java/org/apache/mina/core/future/DefaultConnectFuture.java ---------------------------------------------------------------------- diff --git a/mina-core/src/main/java/org/apache/mina/core/future/DefaultConnectFuture.java b/mina-core/src/main/java/org/apache/mina/core/future/DefaultConnectFuture.java index 4d283fd..1860f0c 100644 --- a/mina-core/src/main/java/org/apache/mina/core/future/DefaultConnectFuture.java +++ b/mina-core/src/main/java/org/apache/mina/core/future/DefaultConnectFuture.java @@ -123,8 +123,8 @@ public class DefaultConnectFuture extends DefaultIoFuture implements ConnectFutu /** * {@inheritDoc} */ - public void cancel() { - setValue(CANCELED); + public boolean cancel() { + return setValue(CANCELED); } /** http://git-wip-us.apache.org/repos/asf/mina/blob/f1972fc3/mina-core/src/main/java/org/apache/mina/core/future/DefaultIoFuture.java ---------------------------------------------------------------------- diff --git a/mina-core/src/main/java/org/apache/mina/core/future/DefaultIoFuture.java b/mina-core/src/main/java/org/apache/mina/core/future/DefaultIoFuture.java index c664aab..fa59906 100644 --- a/mina-core/src/main/java/org/apache/mina/core/future/DefaultIoFuture.java +++ b/mina-core/src/main/java/org/apache/mina/core/future/DefaultIoFuture.java @@ -293,12 +293,14 @@ public class DefaultIoFuture implements IoFuture { * Sets the result of the asynchronous operation, and mark it as finished. * * @param newValue The result to store into the Future + * @return {@code true} if the value has been set, {@code false} if + * the future already has a value (thus is in ready state) */ - public void setValue(Object newValue) { + public boolean setValue(Object newValue) { synchronized (lock) { // Allowed only once. if (ready) { - return; + return false; } result = newValue; @@ -312,6 +314,8 @@ public class DefaultIoFuture implements IoFuture { // Last, not least, inform the listeners notifyListeners(); + + return true; } /** http://git-wip-us.apache.org/repos/asf/mina/blob/f1972fc3/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoConnector.java ---------------------------------------------------------------------- diff --git a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoConnector.java b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoConnector.java index 147ad1e..167e8a5 100644 --- a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoConnector.java +++ b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoConnector.java @@ -569,20 +569,25 @@ public abstract class AbstractPollingIoConnector<T extends AbstractIoSession, H> } public final class ConnectionRequest extends DefaultConnectFuture { + /** The handle associated with this connection request */ private final H handle; + /** The time up to this connection request will be valid */ private final long deadline; + /** The callback to call when the session is initialized */ private final IoSessionInitializer<? extends ConnectFuture> sessionInitializer; public ConnectionRequest(H handle, IoSessionInitializer<? extends ConnectFuture> callback) { this.handle = handle; long timeout = getConnectTimeoutMillis(); + if (timeout <= 0L) { this.deadline = Long.MAX_VALUE; } else { this.deadline = System.currentTimeMillis() + timeout; } + this.sessionInitializer = callback; } @@ -599,13 +604,20 @@ public abstract class AbstractPollingIoConnector<T extends AbstractIoSession, H> } @Override - public void cancel() { + public boolean cancel() { if (!isDone()) { - super.cancel(); - cancelQueue.add(this); - startupWorker(); - wakeup(); + boolean justCancelled = super.cancel(); + + // We haven't cancelled the request before, so add the future + // in the cancel queue. + if (justCancelled) { + cancelQueue.add(this); + startupWorker(); + wakeup(); + } } + + return true; } } }
