Home / Class/ WriteTask Class — netty Architecture

WriteTask Class — netty Architecture

Architecture documentation for the WriteTask class in AbstractChannelHandlerContext.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  5e541a04_978d_cf2e_cfd4_e2add246c7cf["WriteTask"]
  c58110f1_60ae_157d_f668_f5a6356af671["AbstractChannelHandlerContext.java"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|defined in| c58110f1_60ae_157d_f668_f5a6356af671
  6c3e4aa6_2bb5_0dfe_9566_1e5707467753["WriteTask()"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|method| 6c3e4aa6_2bb5_0dfe_9566_1e5707467753
  f49a7f61_b55c_10d0_a9f5_691a2c5eae69["init()"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|method| f49a7f61_b55c_10d0_a9f5_691a2c5eae69
  133fbebe_10e6_a3e9_8036_d39de250d4cd["run()"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|method| 133fbebe_10e6_a3e9_8036_d39de250d4cd
  72e73230_ce94_86e0_b594_16bff83940a3["cancel()"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|method| 72e73230_ce94_86e0_b594_16bff83940a3
  4ced7ae1_b517_2cbc_95c4_ac69802062d0["decrementPendingOutboundBytes()"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|method| 4ced7ae1_b517_2cbc_95c4_ac69802062d0
  9928f54e_595c_ba36_5f7a_466f283a0270["recycle()"]
  5e541a04_978d_cf2e_cfd4_e2add246c7cf -->|method| 9928f54e_595c_ba36_5f7a_466f283a0270

Relationship Graph

Source Code

transport/src/main/java/io/netty/channel/AbstractChannelHandlerContext.java lines 1073–1153

    static final class WriteTask implements Runnable {
        private static final Recycler<WriteTask> RECYCLER = new Recycler<WriteTask>() {
            @Override
            protected WriteTask newObject(Handle<WriteTask> handle) {
                return new WriteTask(handle);
            }
        };

        static WriteTask newInstance(AbstractChannelHandlerContext ctx,
                Object msg, ChannelPromise promise, boolean flush) {
            WriteTask task = RECYCLER.get();
            init(task, ctx, msg, promise, flush);
            return task;
        }

        private static final boolean ESTIMATE_TASK_SIZE_ON_SUBMIT =
                SystemPropertyUtil.getBoolean("io.netty.transport.estimateSizeOnSubmit", true);

        // Assuming compressed oops, 12 bytes obj header, 4 ref fields and one int field
        private static final int WRITE_TASK_OVERHEAD =
                SystemPropertyUtil.getInt("io.netty.transport.writeTaskSizeOverhead", 32);

        private final Handle<WriteTask> handle;
        private AbstractChannelHandlerContext ctx;
        private Object msg;
        private ChannelPromise promise;
        private int size; // sign bit controls flush

        private WriteTask(Handle<WriteTask> handle) {
            this.handle = handle;
        }

        static void init(WriteTask task, AbstractChannelHandlerContext ctx,
                                   Object msg, ChannelPromise promise, boolean flush) {
            task.ctx = ctx;
            task.msg = msg;
            task.promise = promise;

            if (ESTIMATE_TASK_SIZE_ON_SUBMIT) {
                task.size = ctx.pipeline.estimatorHandle().size(msg) + WRITE_TASK_OVERHEAD;
                ctx.pipeline.incrementPendingOutboundBytes(task.size);
            } else {
                task.size = 0;
            }
            if (flush) {
                task.size |= Integer.MIN_VALUE;
            }
        }

        @Override
        public void run() {
            try {
                decrementPendingOutboundBytes();
                ctx.write(msg, size < 0, promise);
            } finally {
                recycle();
            }
        }

        void cancel() {
            try {
                decrementPendingOutboundBytes();
            } finally {
                recycle();
            }
        }

        private void decrementPendingOutboundBytes() {
            if (ESTIMATE_TASK_SIZE_ON_SUBMIT) {
                ctx.pipeline.decrementPendingOutboundBytes(size & Integer.MAX_VALUE);
            }
        }

        private void recycle() {
            // Set to null so the GC can collect them directly
            ctx = null;
            msg = null;
            promise = null;
            handle.recycle(this);
        }
    }

Frequently Asked Questions

What is the WriteTask class?
WriteTask is a class in the netty codebase, defined in transport/src/main/java/io/netty/channel/AbstractChannelHandlerContext.java.
Where is WriteTask defined?
WriteTask is defined in transport/src/main/java/io/netty/channel/AbstractChannelHandlerContext.java at line 1073.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free