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/06/07 12:02:46 UTC
svn commit: r545136 - in /mina/branches/1.0/core/src:
main/java/org/apache/mina/common/support/DefaultIoFuture.java
test/java/org/apache/mina/common/support/FutureTest.java
Author: trustin
Date: Thu Jun 7 03:02:44 2007
New Revision: 545136
URL: http://svn.apache.org/viewvc?view=rev&rev=545136
Log:
Resolved issue: DIRMINA-377 (Reduce memory consumption of DefaultIoFuture)
* Minimized memory consumption by allocating a special member variable for the first listener.
* Applied additional (experimental) optimization to trunk
Modified:
mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
mina/branches/1.0/core/src/test/java/org/apache/mina/common/support/FutureTest.java
Modified: mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java?view=diff&rev=545136&r1=545135&r2=545136
==============================================================================
--- mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java (original)
+++ mina/branches/1.0/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java Thu Jun 7 03:02:44 2007
@@ -37,7 +37,8 @@
{
private final IoSession session;
private final Object lock;
- private final List listeners = new ArrayList();
+ private IoFutureListener firstListener;
+ private List otherListeners;
private Object result;
private boolean ready;
@@ -182,7 +183,14 @@
synchronized( lock )
{
- listeners.add( listener );
+ if (firstListener == null) {
+ firstListener = listener;
+ } else {
+ if (otherListeners == null) {
+ otherListeners = new ArrayList(1);
+ }
+ otherListeners.add(listener);
+ }
if( ready )
{
listener.operationComplete( this );
@@ -199,7 +207,13 @@
synchronized( lock )
{
- listeners.remove( listener );
+ if (listener == firstListener) {
+ if (otherListeners != null && !otherListeners.isEmpty()) {
+ firstListener = (IoFutureListener) otherListeners.remove(0);
+ }
+ } else if (otherListeners != null) {
+ otherListeners.remove(listener);
+ }
}
}
@@ -207,8 +221,13 @@
{
synchronized( lock )
{
- for( Iterator i = listeners.iterator(); i.hasNext(); ) {
- ( ( IoFutureListener ) i.next() ).operationComplete( this );
+ if (firstListener != null) {
+ firstListener.operationComplete(this);
+ if (otherListeners != null) {
+ for (Iterator i = otherListeners.iterator(); i.hasNext();) {
+ ((IoFutureListener) i.next()).operationComplete( this );
+ }
+ }
}
}
}
Modified: mina/branches/1.0/core/src/test/java/org/apache/mina/common/support/FutureTest.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/test/java/org/apache/mina/common/support/FutureTest.java?view=diff&rev=545136&r1=545135&r2=545136
==============================================================================
--- mina/branches/1.0/core/src/test/java/org/apache/mina/common/support/FutureTest.java (original)
+++ mina/branches/1.0/core/src/test/java/org/apache/mina/common/support/FutureTest.java Thu Jun 7 03:02:44 2007
@@ -26,6 +26,7 @@
import org.apache.mina.common.IoFilterChain;
import org.apache.mina.common.IoFuture;
+import org.apache.mina.common.IoFutureListener;
import org.apache.mina.common.IoHandler;
import org.apache.mina.common.IoService;
import org.apache.mina.common.IoServiceConfig;
@@ -192,6 +193,100 @@
assertFalse( future.isWritten() );
}
+ public void testAddListener() throws Exception {
+ DefaultCloseFuture future = new DefaultCloseFuture( null );
+ assertFalse( future.isReady() );
+ assertFalse( future.isClosed() );
+
+ TestListener listener1 = new TestListener();
+ TestListener listener2 = new TestListener();
+ future.addListener(listener1);
+ future.addListener(listener2);
+
+ TestThread thread = new TestThread( future );
+ thread.start();
+
+ future.setClosed();
+ thread.join();
+
+ assertTrue( thread.success );
+ assertTrue( future.isReady() );
+ assertTrue( future.isClosed() );
+
+ assertSame( future, listener1.notifiedFuture );
+ assertSame( future, listener2.notifiedFuture );
+ }
+
+ public void testLateAddListener() throws Exception {
+ DefaultCloseFuture future = new DefaultCloseFuture( null );
+ assertFalse( future.isReady() );
+ assertFalse( future.isClosed() );
+
+ TestThread thread = new TestThread( future );
+ thread.start();
+
+ future.setClosed();
+ thread.join();
+
+ assertTrue( thread.success );
+ assertTrue( future.isReady() );
+ assertTrue( future.isClosed() );
+
+ TestListener listener = new TestListener();
+ future.addListener(listener);
+ assertSame( future, listener.notifiedFuture );
+ }
+
+ public void testRemoveListener1() throws Exception {
+ DefaultCloseFuture future = new DefaultCloseFuture( null );
+ assertFalse( future.isReady() );
+ assertFalse( future.isClosed() );
+
+ TestListener listener1 = new TestListener();
+ TestListener listener2 = new TestListener();
+ future.addListener(listener1);
+ future.addListener(listener2);
+ future.removeListener(listener1);
+
+ TestThread thread = new TestThread( future );
+ thread.start();
+
+ future.setClosed();
+ thread.join();
+
+ assertTrue( thread.success );
+ assertTrue( future.isReady() );
+ assertTrue( future.isClosed() );
+
+ assertSame( null, listener1.notifiedFuture );
+ assertSame( future, listener2.notifiedFuture );
+ }
+
+ public void testRemoveListener2() throws Exception {
+ DefaultCloseFuture future = new DefaultCloseFuture( null );
+ assertFalse( future.isReady() );
+ assertFalse( future.isClosed() );
+
+ TestListener listener1 = new TestListener();
+ TestListener listener2 = new TestListener();
+ future.addListener(listener1);
+ future.addListener(listener2);
+ future.removeListener(listener2);
+
+ TestThread thread = new TestThread( future );
+ thread.start();
+
+ future.setClosed();
+ thread.join();
+
+ assertTrue( thread.success );
+ assertTrue( future.isReady() );
+ assertTrue( future.isClosed() );
+
+ assertSame( future, listener1.notifiedFuture );
+ assertSame( null, listener2.notifiedFuture );
+ }
+
private static class TestThread extends Thread
{
private final IoFuture future;
@@ -205,6 +300,14 @@
public void run()
{
success = future.join( 10000 );
+ }
+ }
+
+ private static class TestListener implements IoFutureListener {
+ private IoFuture notifiedFuture;
+
+ public void operationComplete(IoFuture future) {
+ this.notifiedFuture = future;
}
}
}