public long transferTo(
     final long count, final ByteBuffer throughBuffer, final StreamSinkChannel target)
     throws IOException {
   if (allAreSet(state, READ_SHUTDOWN) || count <= 0L) {
     return -1L;
   }
   final long res;
   if (Native.HAS_SPLICE && target instanceof NativeDescriptor) {
     res = Native.transfer(fd, count, throughBuffer, ((NativeDescriptor) target).fd);
     if (Native.EXTRA_TRACE) log.tracef("Splice(%d -> %s): %d", fd, target, res);
   } else {
     res = Conduits.transfer(this, count, throughBuffer, target);
   }
   if (res <= 0) state &= ~READ_READY;
   if (res > 0) checkReadTimeout(true);
   return res;
 }
 public long transferFrom(
     final StreamSourceChannel source, final long count, final ByteBuffer throughBuffer)
     throws IOException {
   if (allAreSet(state, WRITE_SHUTDOWN)) {
     throw new ClosedChannelException();
   }
   if (count == 0L) return 0L;
   final long res;
   checkWriteTimeout(false);
   if (Native.HAS_SPLICE && source instanceof NativeDescriptor) {
     res =
         Native.testAndThrowRead(
             Native.transfer(((NativeDescriptor) source).fd, count, throughBuffer, fd));
     if (Native.EXTRA_TRACE) log.tracef("Splice(%s -> %d): %d", source, fd, res);
   } else {
     res = Conduits.transfer(source, count, throughBuffer, this);
   }
   if (res == 0) state &= ~WRITE_READY;
   if (res > 0) checkWriteTimeout(true);
   return res;
 }