You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2014/11/04 14:22:33 UTC

[4/4] git commit: 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.

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 <el...@symas.com>
Authored: Tue Nov 4 14:22:15 2014 +0100
Committer: Emmanuel Lécharny <el...@symas.com>
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;
         }
     }
 }