Merge pull request #33 from normanmaurer/master

Only release FileRegion if configured to do so. See NETTY-440
This commit is contained in:
Norman Maurer 2011-10-22 11:31:46 -07:00
commit c8271a2e1d
4 changed files with 40 additions and 4 deletions

View File

@ -14,13 +14,28 @@ public class DefaultFileRegion implements FileRegion {
private final FileChannel file;
private final long position;
private final long count;
private boolean releaseAfterTransfer;
public DefaultFileRegion(FileChannel file, long position, long count) {
public DefaultFileRegion(FileChannel file, long position, long count, boolean releaseAfterTransfer) {
this.file = file;
this.position = position;
this.count = count;
this.releaseAfterTransfer = releaseAfterTransfer;
}
/**
* Calls {@link #DefaultFileRegion(FileChannel, long, long, boolean)} with <code>true</code>
* as the last argument.
*
* @param file
* @param position
* @param count
*/
public DefaultFileRegion(FileChannel file, long position, long count) {
this(file, position, count, true);
}
@Override
public long getPosition() {
return position;
@ -54,4 +69,13 @@ public class DefaultFileRegion implements FileRegion {
logger.warn("Failed to close a file.", e);
}
}
@Override
public boolean releaseAfterTransfer() {
return releaseAfterTransfer;
}
public void setReleaseAfterTransfer(boolean releaseAfterTransfer) {
this.releaseAfterTransfer = releaseAfterTransfer;
}
}

View File

@ -84,4 +84,12 @@ public interface FileRegion extends ExternalResourceReleasable {
* byte of the region transferred.
*/
long transferTo(WritableByteChannel target, long position) throws IOException;
/**
* Returns <code>true</code> if {@link #releaseExternalResources()} should be called after the
* transfer of the {@link FileRegion} was complete.
*
* @return release
*/
public boolean releaseAfterTransfer();
}

View File

@ -306,8 +306,10 @@ final class SocketSendBufferPool {
@Override
public void release() {
// Make sure the FileRegion resource are released otherwise it may cause a FD leak or something similar
file.releaseExternalResources();
if (file.releaseAfterTransfer()) {
// Make sure the FileRegion resource are released otherwise it may cause a FD leak or something similar
file.releaseExternalResources();
}
}
}

View File

@ -141,7 +141,9 @@ class OioWorker implements Runnable {
}
}
} finally {
fr.releaseExternalResources();
if (fr.releaseAfterTransfer()) {
fr.releaseExternalResources();
}
}
} else {