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/09/27 11:38:19 UTC
svn commit: r579959 -
/mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java
Author: trustin
Date: Thu Sep 27 02:38:18 2007
New Revision: 579959
URL: http://svn.apache.org/viewvc?rev=579959&view=rev
Log:
Optimized IoServiceListenerSupport for better concurrency
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/IoServiceListenerSupport.java
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?rev=579959&r1=579958&r2=579959&view=diff
==============================================================================
--- 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 Thu Sep 27 02:38:18 2007
@@ -19,10 +19,11 @@
*/
package org.apache.mina.common;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.mina.util.ConcurrentHashSet;
@@ -42,7 +43,7 @@
/**
* A list of {@link IoServiceListener}s.
*/
- private final List<IoServiceListener> listeners = new ArrayList<IoServiceListener>();
+ private final List<IoServiceListener> listeners = new CopyOnWriteArrayList<IoServiceListener>();
/**
* Tracks managed sessions.
@@ -54,7 +55,7 @@
*/
private final Set<IoSession> readOnlyManagedSessions = Collections.unmodifiableSet(managedSessions);
- private boolean activated;
+ private final AtomicBoolean activated = new AtomicBoolean();
/**
* Creates a new instance.
@@ -70,18 +71,14 @@
* Adds a new listener.
*/
public void add(IoServiceListener listener) {
- synchronized (listeners) {
- listeners.add(listener);
- }
+ listeners.add(listener);
}
/**
* Removes an existing listener.
*/
public void remove(IoServiceListener listener) {
- synchronized (listeners) {
- listeners.remove(listener);
- }
+ listeners.remove(listener);
}
public Set<IoSession> getManagedSessions() {
@@ -93,18 +90,12 @@
* for all registered listeners.
*/
public void fireServiceActivated() {
- synchronized (listeners) {
- if (activated) {
- return;
- }
+ if (!activated.compareAndSet(false, true)) {
+ return;
+ }
- try {
- for (IoServiceListener l : listeners) {
- l.serviceActivated(service);
- }
- } finally {
- activated = true;
- }
+ for (IoServiceListener l : listeners) {
+ l.serviceActivated(service);
}
}
@@ -113,27 +104,16 @@
* for all registered listeners.
*/
public void fireServiceDeactivated() {
- boolean disconnect = false;
+ if (!activated.compareAndSet(true, false)) {
+ return;
+ }
+
try {
- synchronized (listeners) {
- if (!activated) {
- return;
- }
-
- disconnect = true;
-
- try {
- for (IoServiceListener l : listeners) {
- l.serviceDeactivated(service);
- }
- } finally {
- activated = false;
- }
+ for (IoServiceListener l : listeners) {
+ l.serviceDeactivated(service);
}
} finally {
- if (disconnect) {
- disconnectSessions();
- }
+ disconnectSessions();
}
}
@@ -142,17 +122,19 @@
*/
public void fireSessionCreated(IoSession session) {
boolean firstSession = false;
- synchronized (managedSessions) {
- firstSession = managedSessions.isEmpty();
+ if (session.getService() instanceof IoConnector) {
+ synchronized (managedSessions) {
+ firstSession = managedSessions.isEmpty();
+ }
}
-
+
// If already registered, ignore.
if (!managedSessions.add(session)) {
return;
}
// If the first connector session, fire a virtual service activation event.
- if (session.getService() instanceof IoConnector && firstSession) {
+ if (firstSession) {
fireServiceActivated();
}
@@ -161,10 +143,8 @@
session.getFilterChain().fireSessionOpened();
// Fire listener events.
- synchronized (listeners) {
- for (IoServiceListener l : listeners) {
- l.sessionCreated(session);
- }
+ for (IoServiceListener l : listeners) {
+ l.sessionCreated(session);
}
}
@@ -177,25 +157,24 @@
return;
}
- boolean lastSession = false;
- synchronized (managedSessions) {
- lastSession = managedSessions.isEmpty();
- }
-
// Fire session events.
session.getFilterChain().fireSessionClosed();
// Fire listener events.
try {
- synchronized (listeners) {
- for (IoServiceListener l : listeners) {
- l.sessionDestroyed(session);
- }
+ for (IoServiceListener l : listeners) {
+ l.sessionDestroyed(session);
}
} finally {
// Fire a virtual service deactivation event for the last session of the connector.
- if (session.getService() instanceof IoConnector && lastSession) {
- fireServiceDeactivated();
+ if (session.getService() instanceof IoConnector) {
+ boolean lastSession = false;
+ synchronized (managedSessions) {
+ lastSession = managedSessions.isEmpty();
+ }
+ if (lastSession) {
+ fireServiceDeactivated();
+ }
}
}
}