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 2010/11/03 23:58:11 UTC

svn commit: r1030750 - /mina/branches/2.0.2/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoAcceptor.java

Author: elecharny
Date: Wed Nov  3 22:58:11 2010
New Revision: 1030750

URL: http://svn.apache.org/viewvc?rev=1030750&view=rev
Log:
Fixed the race condition found by Jason (DIRMINA-807)

Modified:
    mina/branches/2.0.2/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoAcceptor.java

Modified: mina/branches/2.0.2/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/branches/2.0.2/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoAcceptor.java?rev=1030750&r1=1030749&r2=1030750&view=diff
==============================================================================
--- mina/branches/2.0.2/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoAcceptor.java (original)
+++ mina/branches/2.0.2/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoAcceptor.java Wed Nov  3 22:58:11 2010
@@ -96,9 +96,11 @@ public abstract class AbstractIoAcceptor
      */
     public final Set<SocketAddress> getLocalAddresses() {
         Set<SocketAddress> localAddresses = new HashSet<SocketAddress>();
-        synchronized (bindLock) {
+        
+        synchronized (boundAddresses){
             localAddresses.addAll(boundAddresses);
         }
+        
         return localAddresses;
     }
 
@@ -146,24 +148,27 @@ public abstract class AbstractIoAcceptor
         }
         
         synchronized (bindLock) {
-            if (!boundAddresses.isEmpty()) {
-                throw new IllegalStateException(
-                        "localAddress can't be set while the acceptor is bound.");
-            }
+            synchronized (boundAddresses) {
+                if (!boundAddresses.isEmpty()) {
+                    throw new IllegalStateException(
+                            "localAddress can't be set while the acceptor is bound." );
+                }
 
-            Collection<SocketAddress> newLocalAddresses = 
-                new ArrayList<SocketAddress>();
-            for (SocketAddress a: localAddresses) {
-                checkAddressType(a);
-                newLocalAddresses.add(a);
-            }
-            
-            if (newLocalAddresses.isEmpty()) {
-                throw new IllegalArgumentException("empty localAddresses");
+                Collection<SocketAddress> newLocalAddresses =
+                    new ArrayList<SocketAddress>();
+
+                for (SocketAddress a: localAddresses) {
+                    checkAddressType(a);
+                    newLocalAddresses.add(a);
+                }
+
+                if (newLocalAddresses.isEmpty()) {
+                    throw new IllegalArgumentException("empty localAddresses");
+                }
+
+                this.defaultLocalAddresses.clear();
+                this.defaultLocalAddresses.addAll( newLocalAddresses );
             }
-            
-            this.defaultLocalAddresses.clear();
-            this.defaultLocalAddresses.addAll(newLocalAddresses);
         }
     }
 
@@ -268,8 +273,10 @@ public abstract class AbstractIoAcceptor
         
         boolean activate = false;
         synchronized (bindLock) {
-            if (boundAddresses.isEmpty()) {
-                activate = true;
+            synchronized (boundAddresses) {
+                if (boundAddresses.isEmpty()) {
+                    activate = true;
+                }
             }
 
             if (getHandler() == null) {
@@ -277,7 +284,11 @@ public abstract class AbstractIoAcceptor
             }
             
             try {
-                boundAddresses.addAll(bindInternal(localAddressesCopy));
+                Set<SocketAddress> addresses = bindInternal( localAddressesCopy );
+                
+                synchronized (boundAddresses) {
+                    boundAddresses.addAll(addresses);
+                }
             } catch (IOException e) {
                 throw e;
             } catch (RuntimeException e) {
@@ -341,35 +352,41 @@ public abstract class AbstractIoAcceptor
         
         boolean deactivate = false;
         synchronized (bindLock) {
-            if (boundAddresses.isEmpty()) {
-                return;
-            }
+            synchronized (boundAddresses) {
+                if (boundAddresses.isEmpty()) {
+                    return;
+                }
 
-            List<SocketAddress> localAddressesCopy = new ArrayList<SocketAddress>();
-            int specifiedAddressCount = 0;
-            for (SocketAddress a: localAddresses) {
-                specifiedAddressCount ++;
-                if (a != null && boundAddresses.contains(a)) {
-                    localAddressesCopy.add(a);
+                List<SocketAddress> localAddressesCopy = new ArrayList<SocketAddress>();
+                int specifiedAddressCount = 0;
+                
+                for (SocketAddress a: localAddresses ) {
+                    specifiedAddressCount++;
+
+                    if ((a != null) && boundAddresses.contains(a) ) {
+                        localAddressesCopy.add(a);
+                    }
                 }
-            }
-            if (specifiedAddressCount == 0) {
-                throw new IllegalArgumentException("localAddresses is empty.");
-            }
-            
-            if (!localAddressesCopy.isEmpty()) {
-                try {
-                    unbind0(localAddressesCopy);
-                } catch (RuntimeException e) {
-                    throw e;
-                } catch (Throwable e) {
-                    throw new RuntimeIoException(
-                            "Failed to unbind from: " + getLocalAddresses(), e);
+                
+                if (specifiedAddressCount == 0) {
+                    throw new IllegalArgumentException( "localAddresses is empty." );
                 }
                 
-                boundAddresses.removeAll(localAddressesCopy);
-                if (boundAddresses.isEmpty()) {
-                    deactivate = true;
+                if (!localAddressesCopy.isEmpty()) {
+                    try {
+                        unbind0(localAddressesCopy);
+                    } catch (RuntimeException e) {
+                        throw e;
+                    } catch (Throwable e) {
+                        throw new RuntimeIoException(
+                                "Failed to unbind from: " + getLocalAddresses(), e );
+                    }
+
+                    boundAddresses.removeAll(localAddressesCopy);
+                    
+                    if (boundAddresses.isEmpty()) {
+                        deactivate = true;
+                    }
                 }
             }
         }