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 2016/02/02 16:48:39 UTC

mina git commit: o Added the isActive(), closeNoew() and closeOnFlush() methods in the IoSession interface o Remaped the close() methods in AbstractIoSession to the newly added methods, and deprecated the old ones o Fixed the disposal of sessions by chec

Repository: mina
Updated Branches:
  refs/heads/2.0 7ffbe3efb -> 77e29bb84


o Added the isActive(), closeNoew() and closeOnFlush() methods in the
IoSession interface
o Remaped the close() methods in AbstractIoSession to the newly added
methods, and deprecated the old ones
o Fixed the disposal of sessions by checking that the session is active
before removing it (otherwise it may be removed twice). That fixes
DIRMINA-1026

Project: http://git-wip-us.apache.org/repos/asf/mina/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/77e29bb8
Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/77e29bb8
Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/77e29bb8

Branch: refs/heads/2.0
Commit: 77e29bb84e0ca6c6e9bafb4ad0ccb506f6ca4716
Parents: 7ffbe3e
Author: Emmanuel Lécharny <el...@symas.com>
Authored: Tue Feb 2 16:48:13 2016 +0100
Committer: Emmanuel Lécharny <el...@symas.com>
Committed: Tue Feb 2 16:48:13 2016 +0100

----------------------------------------------------------------------
 .../polling/AbstractPollingIoProcessor.java     |  8 ++-
 .../mina/core/session/AbstractIoSession.java    | 61 ++++++++++++--------
 .../org/apache/mina/core/session/IoSession.java | 21 +++++++
 .../mina/transport/socket/nio/NioSession.java   |  7 +++
 4 files changed, 72 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina/blob/77e29bb8/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
index abd7045..0bf8979 100644
--- a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
+++ b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
@@ -1135,8 +1135,12 @@ public abstract class AbstractPollingIoProcessor<S extends AbstractIoSession> im
                         boolean hasKeys = false;
                         
                         for (Iterator<S> i = allSessions(); i.hasNext();) {
-                            scheduleRemove(i.next());
-                            hasKeys = true;
+                            IoSession session = i.next();
+                            
+                            if (session.isActive()) {
+                                scheduleRemove(i.next());
+                                hasKeys = true;
+                            }
                         }
 
                         if (hasKeys) {

http://git-wip-us.apache.org/repos/asf/mina/blob/77e29bb8/mina-core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java b/mina-core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java
index 7f46810..7186fba 100644
--- a/mina-core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java
+++ b/mina-core/src/main/java/org/apache/mina/core/session/AbstractIoSession.java
@@ -227,6 +227,14 @@ public abstract class AbstractIoSession implements IoSession {
     /**
      * {@inheritDoc}
      */
+    public boolean isActive() {
+        // Return true by default
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public final boolean isClosing() {
         return closing || closeFuture.isClosed();
     }
@@ -294,22 +302,32 @@ public abstract class AbstractIoSession implements IoSession {
      * {@inheritDoc}
      */
     public final CloseFuture close(boolean rightNow) {
-        if (!isClosing()) {
-            if (rightNow) {
-                synchronized (lock) {
-                    if (isClosing()) {
-                        return closeFuture;
-                    }
-
-                    closing = true;
-                }
-
-                getFilterChain().fireFilterClose();
+        if (rightNow) {
+            return closeNow();
+        } else {
+            return closeOnFlush();
+        }
+    }
 
-                return closeFuture;
-            }
+    /**
+     * {@inheritDoc}
+     */
+    public final CloseFuture close() {
+        try {
+            closeNow();
+        } finally {
+            return closeFuture;
+        }
+    }
 
-            return closeOnFlush();
+    /**
+     * {@inheritDoc}
+     */
+    public final CloseFuture closeOnFlush() {
+        if (!isClosing()) {
+            getWriteRequestQueue().offer(this, CLOSE_REQUEST);
+            getProcessor().flush(this);
+            return closeFuture;
         } else {
             return closeFuture;
         }
@@ -318,7 +336,7 @@ public abstract class AbstractIoSession implements IoSession {
     /**
      * {@inheritDoc}
      */
-    public final CloseFuture close() {
+    public final CloseFuture closeNow() {
         synchronized (lock) {
             if (isClosing()) {
                 return closeFuture;
@@ -328,12 +346,7 @@ public abstract class AbstractIoSession implements IoSession {
         }
 
         getFilterChain().fireFilterClose();
-        return closeFuture;
-    }
 
-    private CloseFuture closeOnFlush() {
-        getWriteRequestQueue().offer(this, CLOSE_REQUEST);
-        getProcessor().flush(this);
         return closeFuture;
     }
 
@@ -1329,10 +1342,12 @@ public abstract class AbstractIoSession implements IoSession {
      * @param currentTime the current time (i.e. {@link System#currentTimeMillis()})
      */
     public static void notifyIdleness(Iterator<? extends IoSession> sessions, long currentTime) {
-        IoSession s = null;
         while (sessions.hasNext()) {
-            s = sessions.next();
-            notifyIdleSession(s, currentTime);
+            IoSession session = sessions.next();
+            
+            if (!session.getCloseFuture().isClosed()) {
+                notifyIdleSession(session, currentTime);
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/mina/blob/77e29bb8/mina-core/src/main/java/org/apache/mina/core/session/IoSession.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/session/IoSession.java b/mina-core/src/main/java/org/apache/mina/core/session/IoSession.java
index b3eb8a5..2e712ee 100644
--- a/mina-core/src/main/java/org/apache/mina/core/session/IoSession.java
+++ b/mina-core/src/main/java/org/apache/mina/core/session/IoSession.java
@@ -178,10 +178,26 @@ public interface IoSession {
      *                    {@code false} to close this session after all queued
      *                    write requests are flushed.
      * @return The associated CloseFuture
+     * @deprecated Use either the closeNow() or the flushAndClose() methods
      */
     CloseFuture close(boolean immediately);
 
     /**
+     * Closes this session immediately.  This operation is asynchronous, it 
+     * returns a {@link CloseFuture}.
+     */
+    CloseFuture closeNow();
+
+    /**
+     * Closes this session after all queued write requests are flushed.  This operation 
+     * is asynchronous.  Wait for the returned {@link CloseFuture} if you want to wait 
+     * for the session actually closed.
+     *
+     * @return The associated CloseFuture
+     */
+    CloseFuture closeOnFlush();
+
+    /**
      * Closes this session after all queued write requests
      * are flushed. This operation is asynchronous.  Wait for the returned
      * {@link CloseFuture} if you want to wait for the session actually closed.
@@ -363,6 +379,11 @@ public interface IoSession {
      * @return <tt>true</tt> if this session is connected with remote peer.
      */
     boolean isConnected();
+    
+    /**
+     * @return <tt>true</tt> if this session is active.
+     */
+    boolean isActive();
 
     /**
      * @return <tt>true</tt> if and only if this session is being closed

http://git-wip-us.apache.org/repos/asf/mina/blob/77e29bb8/mina-core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java b/mina-core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
index cddf4bc..bc80d9c 100644
--- a/mina-core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
+++ b/mina-core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java
@@ -96,4 +96,11 @@ public abstract class NioSession extends AbstractIoSession {
     public IoProcessor<NioSession> getProcessor() {
         return processor;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final boolean isActive() {
+        return key.isValid();
+    }
 }