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/07/31 09:05:03 UTC

svn commit: r561246 - in /mina/trunk/core/src/main/java/org/apache/mina/common/support: BaseIoSession.java DefaultFileRegion.java DefaultSendFileRegion.java

Author: trustin
Date: Tue Jul 31 00:05:02 2007
New Revision: 561246

URL: http://svn.apache.org/viewvc?view=rev&rev=561246
Log:
* Renamed DefaultSendFileRegion to DefaultFileRegion
* Fixed file descriptor leak on write(File)

Added:
    mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultFileRegion.java
      - copied, changed from r561245, mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultSendFileRegion.java
Removed:
    mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultSendFileRegion.java
Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java?view=diff&rev=561246&r1=561245&r2=561246
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java Tue Jul 31 00:05:02 2007
@@ -36,6 +36,8 @@
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoAcceptor;
+import org.apache.mina.common.IoFuture;
+import org.apache.mina.common.IoFutureListener;
 import org.apache.mina.common.IoService;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.common.TrafficMask;
@@ -149,33 +151,50 @@
             throw new NullPointerException("message");
         }
 
+        synchronized (lock) {
+            if (isClosing() || !isConnected()) {
+                return DefaultWriteFuture.newNotWrittenFuture(this);
+            }
+        }
+
+        FileChannel channel = null;
         if (message instanceof ByteBuffer
                 && !((ByteBuffer) message).hasRemaining()) {
             throw new IllegalArgumentException(
                     "message is empty. Forgot to call flip()?");
-        } else if (message instanceof File || message instanceof FileChannel) {
+        } else if (message instanceof FileChannel) {
+            channel = (FileChannel) message;
             try {
-                FileChannel channel;
-                if (message instanceof File) {
-                    File file = (File) message;
-                    channel = new FileInputStream(file).getChannel();
-                } else {
-                    channel = (FileChannel) message;
-                }
-                message = new DefaultSendFileRegion(channel, 0, channel.size());
+                message = new DefaultFileRegion(channel, 0, channel.size());
             } catch (IOException e) {
                 ExceptionMonitor.getInstance().exceptionCaught(e);
+                return DefaultWriteFuture.newNotWrittenFuture(this);
             }
-        }
-
-        synchronized (lock) {
-            if (isClosing() || !isConnected()) {
+        } else if (message instanceof File) {
+            File file = (File) message;
+            try {
+                channel = new FileInputStream(file).getChannel();
+            } catch (IOException e) {
+                ExceptionMonitor.getInstance().exceptionCaught(e);
                 return DefaultWriteFuture.newNotWrittenFuture(this);
             }
         }
-
+        
         WriteFuture future = new DefaultWriteFuture(this);
         write0(new DefaultWriteRequest(message, future, remoteAddress));
+        
+        if (message instanceof File) {
+            final FileChannel finalChannel = channel;
+            future.addListener(new IoFutureListener() {
+                public void operationComplete(IoFuture future) {
+                    try {
+                        finalChannel.close();
+                    } catch (IOException e) {
+                        ExceptionMonitor.getInstance().exceptionCaught(e);
+                    }
+                }
+            });
+        }
 
         return future;
     }

Copied: mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultFileRegion.java (from r561245, mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultSendFileRegion.java)
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultFileRegion.java?view=diff&rev=561246&p1=mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultSendFileRegion.java&r1=561245&p2=mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultFileRegion.java&r2=561246
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultSendFileRegion.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultFileRegion.java Tue Jul 31 00:05:02 2007
@@ -4,7 +4,7 @@
 
 import org.apache.mina.common.FileRegion;
 
-public class DefaultSendFileRegion implements FileRegion {
+public class DefaultFileRegion implements FileRegion {
 
     private final FileChannel channel;
     
@@ -12,7 +12,7 @@
     private long position;
     private long count;
     
-    public DefaultSendFileRegion(FileChannel channel, long position, long count) {
+    public DefaultFileRegion(FileChannel channel, long position, long count) {
         if (channel == null) {
             throw new IllegalArgumentException("channel can not be null");
         }