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/11/20 15:24:46 UTC

svn commit: r596687 - in /mina/trunk/core/src: main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java test/java/org/apache/mina/transport/AbstractBindTest.java

Author: trustin
Date: Tue Nov 20 06:24:46 2007
New Revision: 596687

URL: http://svn.apache.org/viewvc?rev=596687&view=rev
Log:
Fixed descriptor leak in NioSocketAcceptor

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java
    mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java
    mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java?rev=596687&r1=596686&r2=596687&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoAcceptor.java Tue Nov 20 06:24:46 2007
@@ -106,7 +106,7 @@
     protected abstract Iterator<H> selectedHandles();
     protected abstract H bind(SocketAddress localAddress) throws Exception;
     protected abstract SocketAddress localAddress(H handle) throws Exception;
-    protected abstract T accept(IoProcessor<T> processor, H handle) throws Exception;
+    protected abstract T accept(IoProcessor<T> processor, H handle);
     protected abstract void unbind(H handle) throws Exception;
 
     @Override
@@ -246,29 +246,15 @@
                 H handle = handles.next();
                 handles.remove();
 
-                boolean success = false;
-                try {
-                    T session = accept(processor, handle);
-                    if (session == null) {
-                        break;
-                    }
-                    
-                    finishSessionInitialization(session, null);
-
-                    // add the session to the SocketIoProcessor
-                    session.getProcessor().add(session);
-                    success = true;
-                } catch (Throwable t) {
-                    ExceptionMonitor.getInstance().exceptionCaught(t);
-                } finally {
-                    if (!success) {
-                        try {
-                            unbind(handle);
-                        } catch (Throwable t) {
-                            ExceptionMonitor.getInstance().exceptionCaught(t);
-                        }
-                    }
+                T session = accept(processor, handle);
+                if (session == null) {
+                    break;
                 }
+                
+                finishSessionInitialization(session, null);
+
+                // add the session to the SocketIoProcessor
+                session.getProcessor().add(session);
             }
         }
     }
@@ -295,12 +281,10 @@
             try {
                 for (SocketAddress a: localAddresses) {
                     H handle = null;
-                    boolean success = false;
                     try {
                         handle = bind(a);
-                        success = true;
                     } finally {
-                        if (!success && handle != null) {
+                        if (handle != null) {
                             try {
                                 unbind(handle);
                             } catch (Exception e) {

Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java?rev=596687&r1=596686&r2=596687&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketAcceptor.java Tue Nov 20 06:24:46 2007
@@ -170,7 +170,7 @@
     
     @Override
     protected NioSession accept(IoProcessor<NioSession> processor,
-            ServerSocketChannel handle) throws Exception {
+            ServerSocketChannel handle) {
 
         SelectionKey key = handle.keyFor(selector);
         if (!key.isAcceptable()) {
@@ -178,7 +178,14 @@
         }
 
         // accept the connection from the client
-        SocketChannel ch = handle.accept();
+        SocketChannel ch;
+        try {
+            ch = handle.accept();
+        } catch (IOException e) {
+            ExceptionMonitor.getInstance().exceptionCaught(e);
+            return null;
+        }
+
         if (ch == null) {
             return null;
         }
@@ -190,14 +197,22 @@
     protected ServerSocketChannel bind(SocketAddress localAddress)
             throws Exception {
         ServerSocketChannel c = ServerSocketChannel.open();
-        c.configureBlocking(false);
-        // Configure the server socket,
-        c.socket().setReuseAddress(isReuseAddress());
-        c.socket().setReceiveBufferSize(
-                getSessionConfig().getReceiveBufferSize());
-        // and bind.
-        c.socket().bind(localAddress, getBacklog());
-        c.register(selector, SelectionKey.OP_ACCEPT);
+        boolean success = false;
+        try {
+            c.configureBlocking(false);
+            // Configure the server socket,
+            c.socket().setReuseAddress(isReuseAddress());
+            c.socket().setReceiveBufferSize(
+                    getSessionConfig().getReceiveBufferSize());
+            // and bind.
+            c.socket().bind(localAddress, getBacklog());
+            c.register(selector, SelectionKey.OP_ACCEPT);
+            success = true;
+        } finally {
+            if (!success) {
+                unbind(c);
+            }
+        }
         return c;
     }
 

Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java?rev=596687&r1=596686&r2=596687&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/AbstractBindTest.java Tue Nov 20 06:24:46 2007
@@ -81,6 +81,7 @@
                 socketBound = true;
                 break;
             } catch (IOException e) {
+                //System.out.println(e.getMessage());
             }
         }