You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/11/27 05:04:01 UTC

svn commit: r598511 - in /mina/trunk/core/src/main/java/org/apache/mina/common: AbstractIoService.java AbstractIoSession.java DefaultIoFilterChain.java IdleStatusChecker.java

Author: trustin
Date: Mon Nov 26 20:03:57 2007
New Revision: 598511

URL: http://svn.apache.org/viewvc?rev=598511&view=rev
Log:
* Simplified service idleness notification
* Made sure idleCount is reset to 0 when idleTime becomes 0


Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java
    mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoFilterChain.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IdleStatusChecker.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java?rev=598511&r1=598510&r2=598511&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java Mon Nov 26 20:03:57 2007
@@ -33,6 +33,28 @@
  * @version $Rev$, $Date$
  */
 public abstract class AbstractIoService implements IoService {
+    private static final IoServiceListener SERVICE_ACTIVATION_LISTENER =
+        new IoServiceListener() {
+            public void serviceActivated(IoService service) {
+                // Update lastIoTime.
+                AbstractIoService s = (AbstractIoService) service;
+                if (s.getLastReadTime() == 0) {
+                    s.setLastReadTime(s.getActivationTime());
+                }
+                if (s.getLastWriteTime() == 0) {
+                    s.setLastWriteTime(s.getActivationTime());
+                }
+                
+                // Start idleness notification.
+                IdleStatusChecker.getInstance().addService(s);
+            }
+
+            public void serviceDeactivated(IoService service) {}
+            public void serviceIdle(IoService service, IdleStatus idleStatus) {}
+            public void sessionCreated(IoSession session) {}
+            public void sessionDestroyed(IoSession session) {}
+    };
+    
     /**
      * Current filter chain builder.
      */
@@ -110,6 +132,7 @@
         }
 
         this.listeners = new IoServiceListenerSupport(this);
+        this.listeners.add(SERVICE_ACTIVATION_LISTENER);
         this.sessionConfig = sessionConfig;
     }
 
@@ -426,7 +449,7 @@
         if (idleTime < 0) {
             throw new IllegalArgumentException("Illegal idle time: " + idleTime);
         }
-
+        
         if (status == IdleStatus.BOTH_IDLE) {
             idleTimeForBoth = idleTime;
         } else if (status == IdleStatus.READER_IDLE) {
@@ -436,6 +459,16 @@
         } else {
             throw new IllegalArgumentException("Unknown idle status: " + status);
         }
+        
+        if (idleTime == 0) {
+            if (status == IdleStatus.BOTH_IDLE) {
+                idleCountForBoth = 0;
+            } else if (status == IdleStatus.READER_IDLE) {
+                idleCountForRead = 0;
+            } else if (status == IdleStatus.WRITER_IDLE) {
+                idleCountForWrite = 0;
+            }
+        }
     }
 
     public final boolean isIdle(IdleStatus status) {
@@ -633,6 +666,14 @@
     }
     
     protected final void finishSessionInitialization(IoSession session, IoFuture future) {
+        // Update lastIoTime if needed.
+        if (getLastReadTime() == 0) {
+            setLastReadTime(getActivationTime());
+        }
+        if (getLastWriteTime() == 0) {
+            setLastWriteTime(getActivationTime());
+        }
+
         // Every property but attributeMap should be set now.
         // Now initialize the attributeMap.  The reason why we initialize
         // the attributeMap at last is to make sure all session properties

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java?rev=598511&r1=598510&r2=598511&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java Mon Nov 26 20:03:57 2007
@@ -682,6 +682,20 @@
     }
     
     public final int getIdleCount(IdleStatus status) {
+        if (getConfig().getIdleTime(status) == 0) {
+            if (status == IdleStatus.BOTH_IDLE) {
+                idleCountForBoth = 0;
+            }
+
+            if (status == IdleStatus.READER_IDLE) {
+                idleCountForRead = 0;
+            }
+
+            if (status == IdleStatus.WRITER_IDLE) {
+                idleCountForWrite = 0;
+            }
+        }
+
         if (status == IdleStatus.BOTH_IDLE) {
             return idleCountForBoth;
         }

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoFilterChain.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoFilterChain.java?rev=598511&r1=598510&r2=598511&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoFilterChain.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoFilterChain.java Mon Nov 26 20:03:57 2007
@@ -322,13 +322,6 @@
     }
 
     public void fireSessionCreated() {
-        IoService service = session.getService();
-        if (service instanceof AbstractIoService) {
-            AbstractIoService s = (AbstractIoService) service;
-            s.setLastReadTime(session.getCreationTime());
-            s.setLastWriteTime(session.getCreationTime());
-        }
-
         Entry head = this.head;
         callNextSessionCreated(head, session);
     }

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IdleStatusChecker.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IdleStatusChecker.java?rev=598511&r1=598510&r2=598511&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IdleStatusChecker.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IdleStatusChecker.java Mon Nov 26 20:03:57 2007
@@ -24,7 +24,7 @@
 import java.util.Set;
 
 /**
- * Dectects idle sessions and fires <tt>sessionIdle</tt> events to them.
+ * Detects idle sessions and fires <tt>sessionIdle</tt> events to them.
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  * @version $Rev: 525369 $, $Date: 2007-04-04 05:05:11 +0200 (mer., 04 avr. 2007) $
@@ -37,6 +37,7 @@
     }
 
     private final Set<AbstractIoSession> sessions = new HashSet<AbstractIoSession>();
+    private final Set<AbstractIoService> services = new HashSet<AbstractIoService>();
 
     private final Worker worker = new Worker();
 
@@ -49,6 +50,12 @@
             sessions.add(session);
         }
     }
+    
+    public void addService(AbstractIoService service) {
+        synchronized (services) {
+            services.add(service);
+        }
+    }
 
     private class Worker extends Thread {
         private Worker() {
@@ -77,6 +84,19 @@
                         }
                     }
                 }
+                
+                synchronized (services) {
+                    Iterator<AbstractIoService> it = services.iterator();
+                    while (it.hasNext()) {
+                        AbstractIoService service = it.next();
+                        if (!service.isActive()) {
+                            it.remove();
+                            System.out.println("DROPPED");
+                        } else {
+                            notifyIdleness(service, currentTime, false);
+                        }
+                    }
+                }
             }
         }
     }
@@ -92,10 +112,6 @@
         while (sessions.hasNext()) {
             s = sessions.next();
             notifyIdleSession(s, currentTime);
-        }
-        
-        if (s != null) {
-            notifyIdleness(s.getService(), currentTime, false);
         }
     }