Skip to the content.

Home / cs-notes / Architecture / Components / Netty / Channel / AbstractNioByteChannel / doWrite0

    /**
     * Write objects to the OS.
     * @param in the collection which contains objects to write.
     * @return The value that should be decremented from the write quantum which starts at
     * {@link ChannelConfig#getWriteSpinCount()}. The typical use cases are as follows:
     * <ul>
     *     <li>0 - if no write was attempted. This is appropriate if an empty {@link ByteBuf} (or other empty content)
     *     is encountered</li>
     *     <li>1 - if a single call to write data was made to the OS</li>
     *     <li>{@link ChannelUtils#WRITE_STATUS_SNDBUF_FULL} - if an attempt to write data was made to the OS, but no
     *     data was accepted</li>
     * </ul>
     * @throws Exception if an I/O exception occurs during write.
     */
    protected final int doWrite0(ChannelOutboundBuffer in) throws Exception {
        Object msg = in.current();
        if (msg == null) {
            // Directly return here so incompleteWrite(...) is not called.
            return 0;
        }
        return doWriteInternal(in, in.current());
    }
private int doWriteInternal(ChannelOutboundBuffer in, Object msg) throws Exception {
    ...
    ByteBuf buf = (ByteBuf) msg;
    ...
    final int localFlushedAmount = doWriteBytes(buf);
    ...
    } else if (msg instanceof FileRegion) {
        FileRegion region = (FileRegion) msg;
        ...
        long localFlushedAmount = doWriteFileRegion(region);
        ...
    ...
}
    /**
     * Write bytes form the given {@link ByteBuf} to the underlying {@link java.nio.channels.Channel}.
     * @param buf           the {@link ByteBuf} from which the bytes should be written
     * @return amount       the amount of written bytes
     */
    protected abstract int doWriteBytes(ByteBuf buf) throws Exception;