public long transferFrom(FileChannel src, final long position, final long count)
     throws IOException {
   if (allAreSet(state, WRITE_SHUTDOWN)) {
     throw new ClosedChannelException();
   }
   if (count == 0L) return 0L;
   final long res;
   src = thread.getWorker().getXnio().unwrapFileChannel(src);
   if (Native.HAS_SENDFILE && src instanceof FileChannelImpl) {
     res = Native.testAndThrowRead(Native.sendfile(fd, src, position, count));
     if (Native.EXTRA_TRACE) log.tracef("Sendfile(%s -> %d): %d", src, fd, res);
   } else {
     res = src.transferTo(position, count, new ConduitWritableByteChannel(this));
   }
   if (res == 0) state &= ~WRITE_READY;
   checkWriteTimeout(res > 0);
   return res;
 }
Ejemplo n.º 2
0
 /**
  * Write a {@link DefaultFileRegion}
  *
  * @param region the {@link DefaultFileRegion} from which the bytes should be written
  * @return amount the amount of written bytes
  */
 private long doWriteFileRegion(DefaultFileRegion region, long count) throws Exception {
   return Native.sendfile(fd, region, region.transfered(), count);
 }