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