You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/02/06 07:16:46 UTC
svn commit: r151548 - in incubator/directory/network/trunk/mina/src:
java/org/apache/mina/io/datagram/DatagramAcceptor.java
java/org/apache/mina/io/socket/SocketAcceptor.java
test/org/apache/mina/examples/echoserver/Test.java
Author: trustin
Date: Sat Feb 5 22:16:44 2005
New Revision: 151548
URL: http://svn.apache.org/viewcvs?view=rev&rev=151548
Log:
* Fixed: File descriptor leakage on bind failure
* Fixed: Echo server test fails on machines whose port 8080 is not availble.
Modified:
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketAcceptor.java
incubator/directory/network/trunk/mina/src/test/org/apache/mina/examples/echoserver/Test.java
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=diff&r1=151547&r2=151548
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Sat Feb 5 22:16:44 2005
@@ -52,7 +52,7 @@
private final IoHandlerFilterManager filterManager = new IoHandlerFilterManager();
- private final int id = nextId++;
+ private final int id = nextId ++ ;
private final Selector selector;
@@ -86,13 +86,25 @@
if( handler == null )
throw new NullPointerException( "handler" );
- if( ! ( address instanceof InetSocketAddress ) )
+ if( !( address instanceof InetSocketAddress ) )
throw new IllegalArgumentException( "Unexpected address type: "
+ address.getClass() );
DatagramChannel ch = DatagramChannel.open();
- ch.configureBlocking( false );
- ch.socket().bind( address );
+ boolean bound = false;
+ try
+ {
+ ch.configureBlocking( false );
+ ch.socket().bind( address );
+ bound = true;
+ }
+ finally
+ {
+ if( !bound )
+ {
+ ch.close();
+ }
+ }
synchronized( this )
{
@@ -196,8 +208,8 @@
}
catch( IOException e )
{
- exceptionMonitor
- .exceptionCaught( DatagramAcceptor.this, e );
+ exceptionMonitor.exceptionCaught( DatagramAcceptor.this,
+ e );
try
{
@@ -222,11 +234,8 @@
DatagramChannel ch = ( DatagramChannel ) key.channel();
DatagramSession session = new DatagramSession(
- DatagramAcceptor.this,
- filterManager,
- ch,
- ( IoHandler ) key
- .attachment() );
+ DatagramAcceptor.this, filterManager, ch,
+ ( IoHandler ) key.attachment() );
session.setSelectionKey( key );
if( key.isReadable() )
@@ -247,8 +256,8 @@
ByteBuffer readBuf = ByteBuffer.allocate( 2048 );
try
{
- SocketAddress remoteAddress = session.getChannel()
- .receive( readBuf.buf() );
+ SocketAddress remoteAddress = session.getChannel().receive(
+ readBuf.buf() );
if( remoteAddress != null )
{
readBuf.flip();
@@ -334,7 +343,8 @@
continue;
}
- int writtenBytes = ch.send( buf.buf(), session.getRemoteAddress() );
+ int writtenBytes = ch
+ .send( buf.buf(), session.getRemoteAddress() );
SelectionKey key = session.getSelectionKey();
if( writtenBytes == 0 )
@@ -344,9 +354,8 @@
}
else
{
- key
- .interestOps( key.interestOps()
- & ( ~SelectionKey.OP_WRITE ) );
+ key.interestOps( key.interestOps()
+ & ( ~SelectionKey.OP_WRITE ) );
// pop and fire event
synchronized( writeBufferQueue )
@@ -377,7 +386,8 @@
if( req == null )
break;
- req.channel.register( selector, SelectionKey.OP_READ, req.handler );
+ req.channel
+ .register( selector, SelectionKey.OP_READ, req.handler );
}
}
@@ -416,12 +426,12 @@
public void removeAllFilters()
{
- filterManager.removeAllFilters();
+ filterManager.removeAllFilters();
}
-
+
public List getAllFilters()
{
- return filterManager.filters();
+ return filterManager.filters();
}
private static class RegistrationRequest
@@ -430,7 +440,8 @@
private final IoHandler handler;
- private RegistrationRequest( DatagramChannel channel, IoHandler handler )
+ private RegistrationRequest( DatagramChannel channel,
+ IoHandler handler )
{
this.channel = channel;
this.handler = handler;
@@ -451,4 +462,4 @@
this.exceptionMonitor = monitor;
}
-}
\ No newline at end of file
+}
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketAcceptor.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketAcceptor.java?view=diff&r1=151547&r2=151548
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketAcceptor.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketAcceptor.java Sat Feb 5 22:16:44 2005
@@ -51,7 +51,7 @@
private final IoHandlerFilterManager filterManager = new IoHandlerFilterManager();
- private final int id = nextId++;
+ private final int id = nextId ++ ;
private final Selector selector;
@@ -96,13 +96,25 @@
if( handler == null )
throw new NullPointerException( "handler" );
- if( ! ( address instanceof InetSocketAddress ) )
+ if( !( address instanceof InetSocketAddress ) )
throw new IllegalArgumentException( "Unexpected address type: "
+ address.getClass() );
ServerSocketChannel ssc = ServerSocketChannel.open();
- ssc.configureBlocking( false );
- ssc.socket().bind( address, backlog );
+ boolean bound = false;
+ try
+ {
+ ssc.configureBlocking( false );
+ ssc.socket().bind( address, backlog );
+ bound = true;
+ }
+ finally
+ {
+ if( !bound )
+ {
+ ssc.close();
+ }
+ }
synchronized( this )
{
@@ -209,10 +221,8 @@
continue;
SocketSession session = new SocketSession(
- filterManager,
- ch,
- ( IoHandler ) key
- .attachment() );
+ filterManager, ch, ( IoHandler ) key
+ .attachment() );
SocketIoProcessor.getInstance().addSession( session );
}
}
@@ -249,7 +259,7 @@
break;
req.channel.register( selector, SelectionKey.OP_ACCEPT,
- req.handler );
+ req.handler );
}
}
@@ -285,15 +295,15 @@
{
filterManager.removeFilter( filter );
}
-
+
public void removeAllFilters()
{
- filterManager.removeAllFilters();
+ filterManager.removeAllFilters();
}
public List getAllFilters()
{
- return filterManager.filters();
+ return filterManager.filters();
}
private static class RegistrationRequest
@@ -324,4 +334,4 @@
this.exceptionMonitor = monitor;
}
-}
\ No newline at end of file
+}
Modified: incubator/directory/network/trunk/mina/src/test/org/apache/mina/examples/echoserver/Test.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/test/org/apache/mina/examples/echoserver/Test.java?view=diff&r1=151547&r2=151548
==============================================================================
--- incubator/directory/network/trunk/mina/src/test/org/apache/mina/examples/echoserver/Test.java (original)
+++ incubator/directory/network/trunk/mina/src/test/org/apache/mina/examples/echoserver/Test.java Sat Feb 5 22:16:44 2005
@@ -3,6 +3,7 @@
*/
package org.apache.mina.examples.echoserver;
+import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
@@ -24,7 +25,7 @@
*/
public class Test extends TestCase
{
- private static final int PORT = 8080;
+ private int port;
private IoAcceptor acceptor;
@@ -40,7 +41,7 @@
private static String toString( byte[] buf )
{
StringBuffer str = new StringBuffer( buf.length * 4 );
- for( int i = 0; i < buf.length; i++ )
+ for( int i = 0; i < buf.length; i ++ )
{
str.append( buf[ i ] );
str.append( ' ' );
@@ -50,36 +51,79 @@
protected void setUp() throws Exception
{
+ acceptor = new SocketAcceptor();
+ datagramAcceptor = new DatagramAcceptor();
+
+ // Find an availble test port and bind to it.
+ boolean socketBound = false;
+ boolean datagramBound = false;
+ for( port = 1024; port <= 65535; port ++ )
+ {
+ socketBound = false;
+ datagramBound = false;
+ try
+ {
+ acceptor.bind( new InetSocketAddress( port ),
+ new EchoProtocolHandler() );
+ socketBound = true;
+
+ datagramAcceptor.bind( new InetSocketAddress( port ),
+ new EchoProtocolHandler() );
+ datagramBound = true;
+
+ break;
+ }
+ catch( IOException e )
+ {
+ }
+ finally
+ {
+ if( !socketBound || !datagramBound )
+ {
+ if( socketBound )
+ {
+ acceptor.unbind( new InetSocketAddress( port ) );
+ }
+ if( datagramBound )
+ {
+ datagramAcceptor
+ .unbind( new InetSocketAddress( port ) );
+ }
+ }
+ }
+ }
+
+ // If there is no port available, test fails.
+ if( !socketBound || !datagramBound )
+ {
+ throw new IOException( "Cannot bind any test port." );
+ }
+
+ System.out.println("Using port " + port + " for testing.");
+
threadPoolFilter = new IoThreadPoolFilter();
threadPoolFilter.start();
- acceptor = new SocketAcceptor();
- acceptor.bind( new InetSocketAddress( PORT ),
- new EchoProtocolHandler() );
acceptor.addFilter( Integer.MAX_VALUE, threadPoolFilter );
-
- datagramAcceptor = new DatagramAcceptor();
datagramAcceptor.addFilter( Integer.MAX_VALUE, threadPoolFilter );
- datagramAcceptor.bind( new InetSocketAddress( PORT ),
- new EchoProtocolHandler() );
}
protected void tearDown() throws Exception
{
- acceptor.unbind( new InetSocketAddress( PORT ) );
- datagramAcceptor.unbind( new InetSocketAddress( PORT ) );
+ acceptor.unbind( new InetSocketAddress( port ) );
+ datagramAcceptor.unbind( new InetSocketAddress( port ) );
threadPoolFilter.stop();
}
public void testTCP() throws Exception
{
EchoTCPClient client = new EchoTCPClient();
- client.connect( InetAddress.getLocalHost(), PORT );
+ client.connect( InetAddress.getLocalHost(), port );
client.setSoTimeout( 3000 );
byte[] writeBuf = new byte[ 16 ];
- for( int i = 0; i < 10; i++ )
+ for( int i = 0; i < 10; i ++ )
{
fillWriteBuffer( writeBuf, i );
client.getOutputStream().write( writeBuf );
@@ -87,15 +131,15 @@
byte[] readBuf = new byte[ writeBuf.length ];
- for( int i = 0; i < 10; i++ )
+ for( int i = 0; i < 10; i ++ )
{
fillWriteBuffer( writeBuf, i );
int readBytes = 0;
while( readBytes < readBuf.length )
{
- int nBytes = client.getInputStream()
- .read( readBuf, readBytes, readBuf.length - readBytes );
+ int nBytes = client.getInputStream().read( readBuf,
+ readBytes, readBuf.length - readBytes );
if( nBytes < 0 )
fail( "Unexpected disconnection." );
@@ -131,14 +175,14 @@
client.setSoTimeout( 500 );
- for( int i = 0; i < 10; i++ )
+ for( int i = 0; i < 10; i ++ )
{
fillWriteBuffer( writeBuf, i );
- client.send( writeBuf, writeBuf.length,
- InetAddress.getLocalHost(), PORT );
+ client.send( writeBuf, writeBuf.length, InetAddress
+ .getLocalHost(), port );
assertEquals( readBuf.length, client.receive( readBuf,
- readBuf.length ) );
+ readBuf.length ) );
assertEquals( writeBuf, readBuf );
}
@@ -156,7 +200,7 @@
private void fillWriteBuffer( byte[] writeBuf, int i )
{
- for( int j = writeBuf.length - 1; j >= 0; j-- )
+ for( int j = writeBuf.length - 1; j >= 0; j -- )
{
writeBuf[ j ] = ( byte ) ( j + i );
}
@@ -166,4 +210,4 @@
{
junit.textui.TestRunner.run( Test.class );
}
-}
\ No newline at end of file
+}