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;
+ }
}
}
}