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