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/04/05 08:28:27 UTC
svn commit: r525724 - in /mina/trunk/core/src/main/java/org/apache/mina:
transport/vmpipe/ transport/vmpipe/support/ util/
Author: trustin
Date: Wed Apr 4 23:28:26 2007
New Revision: 525724
URL: http://svn.apache.org/viewvc?view=rev&rev=525724
Log:
* Replaced AnonymousSocketAddress with a VmPipeAddress with negative address value.
* Now all anonymous vm-pipe sockets have its own port number, which is negative.
* The address are managed internally via a HashSet, and the address is removed when the connection is closed.
Removed:
mina/trunk/core/src/main/java/org/apache/mina/util/AnonymousSocketAddress.java
Modified:
mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java
mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeSession.java
mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java?view=diff&rev=525724&r1=525723&r2=525724
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeAcceptor.java Wed Apr 4 23:28:26 2007
@@ -79,15 +79,21 @@
synchronized( boundHandlers )
{
- if( localAddress == null || localAddress.getPort() == 0 )
+ if( localAddress == null || localAddress.getPort() <= 0 )
{
+ localAddress = null;
for( int i = 1; i < Integer.MAX_VALUE; i++ )
{
- localAddress = new VmPipeAddress( i );
- if( !boundHandlers.containsKey( localAddress ) )
+ VmPipeAddress newLocalAddress = new VmPipeAddress( i );
+ if( !boundHandlers.containsKey( newLocalAddress ) )
{
+ localAddress = newLocalAddress;
break;
}
+ }
+
+ if (localAddress == null) {
+ throw new IOException("No port available.");
}
}
else if( boundHandlers.containsKey( localAddress ) )
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java?view=diff&rev=525724&r1=525723&r2=525724
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeConnector.java Wed Apr 4 23:28:26 2007
@@ -21,10 +21,14 @@
import java.io.IOException;
import java.net.SocketAddress;
+import java.util.HashSet;
+import java.util.Set;
import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.ExceptionMonitor;
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.IoSessionConfig;
import org.apache.mina.common.TransportType;
@@ -35,7 +39,6 @@
import org.apache.mina.transport.vmpipe.support.VmPipeFilterChain;
import org.apache.mina.transport.vmpipe.support.VmPipeIdleStatusChecker;
import org.apache.mina.transport.vmpipe.support.VmPipeSessionImpl;
-import org.apache.mina.util.AnonymousSocketAddress;
/**
* Connects to {@link IoHandler}s which is bound on the specified
@@ -88,10 +91,13 @@
this,
getListeners(),
new Object(), // lock
- new AnonymousSocketAddress(),
+ nextAnonymousAddress(), // Assign the local address dynamically,
getHandler(),
entry );
+ // and reclaim the address when the connection is closed.
+ localSession.getCloseFuture().addListener(ANON_ADDRESS_RECLAIMER);
+
// initialize connector session
try
{
@@ -130,5 +136,32 @@
( ( VmPipeFilterChain ) remoteSession.getFilterChain() ).start();
return future;
+ }
+
+ private static final Set<VmPipeAddress> TAKEN_ANON_ADDRESSES =
+ new HashSet<VmPipeAddress>();
+ private static int nextAnonymousAddress = -1;
+
+ private static final IoFutureListener ANON_ADDRESS_RECLAIMER =
+ new AnonymousAddressReclaimer();
+
+ private static VmPipeAddress nextAnonymousAddress() {
+ synchronized (TAKEN_ANON_ADDRESSES) {
+ for (;;) {
+ VmPipeAddress answer = new VmPipeAddress(nextAnonymousAddress --);
+ if (!TAKEN_ANON_ADDRESSES.contains(answer)) {
+ TAKEN_ANON_ADDRESSES.add(answer);
+ return answer;
+ }
+ }
+ }
+ }
+
+ private static class AnonymousAddressReclaimer implements IoFutureListener {
+ public void operationComplete(IoFuture future) {
+ synchronized (TAKEN_ANON_ADDRESSES) {
+ TAKEN_ANON_ADDRESSES.remove(future.getSession().getLocalAddress());
+ }
+ }
}
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeSession.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeSession.java?view=diff&rev=525724&r1=525723&r2=525724
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/VmPipeSession.java Wed Apr 4 23:28:26 2007
@@ -4,11 +4,7 @@
public interface VmPipeSession extends IoSession {
VmPipeSessionConfig getConfig();
- /* FIXME: These methods can return AnonymousSocketAddress.
- * We need to create a port number manager like O/S do for port
- * numbers.
VmPipeAddress getRemoteAddress();
VmPipeAddress getLocalAddress();
VmPipeAddress getServiceAddress();
- */
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java?view=diff&rev=525724&r1=525723&r2=525724
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/vmpipe/support/VmPipeSessionImpl.java Wed Apr 4 23:28:26 2007
@@ -19,7 +19,6 @@
*/
package org.apache.mina.transport.vmpipe.support;
-import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
@@ -34,6 +33,7 @@
import org.apache.mina.common.support.BaseIoSession;
import org.apache.mina.common.support.IoServiceListenerSupport;
import org.apache.mina.transport.vmpipe.DefaultVmPipeSessionConfig;
+import org.apache.mina.transport.vmpipe.VmPipeAddress;
import org.apache.mina.transport.vmpipe.VmPipeSession;
import org.apache.mina.transport.vmpipe.VmPipeSessionConfig;
@@ -49,9 +49,9 @@
private final IoService service;
private final IoServiceListenerSupport serviceListeners;
- private final SocketAddress localAddress;
- private final SocketAddress remoteAddress;
- private final SocketAddress serviceAddress;
+ private final VmPipeAddress localAddress;
+ private final VmPipeAddress remoteAddress;
+ private final VmPipeAddress serviceAddress;
private final IoHandler handler;
private final VmPipeFilterChain filterChain;
private final VmPipeSessionImpl remoteSession;
@@ -63,7 +63,7 @@
*/
public VmPipeSessionImpl(
IoService service,
- IoServiceListenerSupport serviceListeners, Object lock, SocketAddress localAddress,
+ IoServiceListenerSupport serviceListeners, Object lock, VmPipeAddress localAddress,
IoHandler handler, VmPipe remoteEntry )
{
this.service = service;
@@ -151,18 +151,18 @@
return TransportType.VM_PIPE;
}
- public SocketAddress getRemoteAddress()
+ public VmPipeAddress getRemoteAddress()
{
return remoteAddress;
}
- public SocketAddress getLocalAddress()
+ public VmPipeAddress getLocalAddress()
{
return localAddress;
}
@Override
- public SocketAddress getServiceAddress()
+ public VmPipeAddress getServiceAddress()
{
return serviceAddress;
}