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/08/17 14:19:41 UTC

svn commit: r567037 - in /mina/trunk/core/src/main/java/org/apache/mina/common: AbstractIoSession.java IoServiceListenerSupport.java IoSession.java

Author: trustin
Date: Fri Aug 17 05:19:36 2007
New Revision: 567037

URL: http://svn.apache.org/viewvc?view=rev&rev=567037
Log:
* Added documentation that explains the equality implementation of IoSession explicitly 
* Added final equality methods to AbstractIoSession to prevent any possible mistakes
* Changed IoSessionListenerSupport to use ConcurrentHashSet

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoSession.java

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?view=diff&rev=567037&r1=567036&r2=567037
==============================================================================
--- 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 Fri Aug 17 05:19:36 2007
@@ -533,6 +533,16 @@
             return getRemoteAddress();
         }
     }
+    
+    @Override
+    public final int hashCode() {
+        return System.identityHashCode(this);
+    }
+    
+    @Override
+    public final boolean equals(Object o) {
+        return this == o;
+    }
 
     @Override
     public String toString() {

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java?view=diff&rev=567037&r1=567036&r2=567037
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java Fri Aug 17 05:19:36 2007
@@ -20,10 +20,11 @@
 package org.apache.mina.common;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.mina.util.IdentityHashSet;
+import org.apache.mina.util.ConcurrentHashSet;
 
 /**
  * A helper which provides addition and removal of {@link IoServiceListener}s and firing
@@ -46,7 +47,12 @@
     /**
      * Tracks managed sesssions.
      */
-    private final Set<IoSession> managedSessions = new IdentityHashSet<IoSession>();
+    private final Set<IoSession> managedSessions = new ConcurrentHashSet<IoSession>();
+
+    /**
+     * Read only version of {@link #managedSessions}.
+     */
+    private final Set<IoSession> readOnlyManagedSessions = Collections.unmodifiableSet(managedSessions);
 
     private boolean activated;
 
@@ -79,9 +85,7 @@
     }
 
     public Set<IoSession> getManagedSessions() {
-        synchronized (managedSessions) {
-            return new IdentityHashSet<IoSession>(managedSessions);
-        }
+        return readOnlyManagedSessions;
     }
 
     /**
@@ -140,11 +144,11 @@
         boolean firstSession = false;
         synchronized (managedSessions) {
             firstSession = managedSessions.isEmpty();
+        }
 
-            // If already registered, ignore.
-            if (!managedSessions.add(session)) {
-                return;
-            }
+        // If already registered, ignore.
+        if (!managedSessions.add(session)) {
+            return;
         }
 
         // If the first connector session, fire a virtual service activation event.
@@ -168,13 +172,13 @@
      * Calls {@link IoServiceListener#sessionDestroyed(IoSession)} for all registered listeners.
      */
     public void fireSessionDestroyed(IoSession session) {
+        // Try to remove the remaining empty session set after removal.
+        if (!managedSessions.remove(session)) {
+            return;
+        }
+
         boolean lastSession = false;
         synchronized (managedSessions) {
-            // Try to remove the remaining empty seession set after removal.
-            if (!managedSessions.remove(session)) {
-                return;
-            }
-
             lastSession = managedSessions.isEmpty();
         }
 
@@ -205,20 +209,11 @@
             return;
         }
 
-        final Object lock = new Object();
-        Set<IoSession> sessionsCopy;
-        synchronized (managedSessions) {
-            sessionsCopy = new IdentityHashSet<IoSession>(managedSessions);
-        }
-
-        for (IoSession s : sessionsCopy) {
-            s.close().addListener(new IoFutureListener() {
-                public void operationComplete(IoFuture future) {
-                    synchronized (lock) {
-                        lock.notifyAll();
-                    }
-                }
-            });
+        Object lock = new Object();
+        IoFutureListener listener = new LockNotifyingListener(lock);
+        
+        for (IoSession s : managedSessions) {
+            s.close().addListener(listener);
         }
 
         try {
@@ -229,6 +224,20 @@
             }
         } catch (InterruptedException ie) {
             // Ignored
+        }
+    }
+    
+    private static class LockNotifyingListener implements IoFutureListener {
+        private final Object lock;
+        
+        public LockNotifyingListener(Object lock) {
+            this.lock = lock;
+        }
+        
+        public void operationComplete(IoFuture future) {
+            synchronized (lock) {
+                lock.notifyAll();
+            }
         }
     }
 }

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IoSession.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoSession.java?view=diff&rev=567037&r1=567036&r2=567037
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoSession.java Fri Aug 17 05:19:36 2007
@@ -44,6 +44,10 @@
  * is executed simultaneously, and therefore you have to make sure the
  * {@link IoFilter} implementations you're using are thread-safe, too. 
  * </p>
+ * 
+ * <h3>Equality of Sessions</h3>
+ * {@link #equals(Object)} and {@link #hashCode()} shall not be overriden
+ * to the default behavior that is defined in {@link Object}.
  *   
  * @author The Apache MINA Project (dev@mina.apache.org)
  * @version $Rev$, $Date$