Home / Class/ ChannelHandlerMask Class — netty Architecture

ChannelHandlerMask Class — netty Architecture

Architecture documentation for the ChannelHandlerMask class in ChannelHandlerMask.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  9765d8d3_2fc6_fd23_4e23_eee14183479c["ChannelHandlerMask"]
  d85f5df6_ae37_bcc8_d784_401b55013c5d["ChannelHandlerMask.java"]
  9765d8d3_2fc6_fd23_4e23_eee14183479c -->|defined in| d85f5df6_ae37_bcc8_d784_401b55013c5d
  5ab977f0_bc02_5db9_4f8e_9d790c9251f9["mask()"]
  9765d8d3_2fc6_fd23_4e23_eee14183479c -->|method| 5ab977f0_bc02_5db9_4f8e_9d790c9251f9
  415dced0_768d_3ef9_f5b5_dd95ec9f9f3d["mask0()"]
  9765d8d3_2fc6_fd23_4e23_eee14183479c -->|method| 415dced0_768d_3ef9_f5b5_dd95ec9f9f3d
  556154cc_4114_03bb_0590_52da3f0b5cc0["isSkippable()"]
  9765d8d3_2fc6_fd23_4e23_eee14183479c -->|method| 556154cc_4114_03bb_0590_52da3f0b5cc0
  bd2ea89b_193a_9202_0397_d4d553720b50["ChannelHandlerMask()"]
  9765d8d3_2fc6_fd23_4e23_eee14183479c -->|method| bd2ea89b_193a_9202_0397_d4d553720b50

Relationship Graph

Source Code

transport/src/main/java/io/netty/channel/ChannelHandlerMask.java lines 35–204

final class ChannelHandlerMask {
    private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelHandlerMask.class);

    // Using to mask which methods must be called for a ChannelHandler.
    static final int MASK_EXCEPTION_CAUGHT = 1;
    static final int MASK_CHANNEL_REGISTERED = 1 << 1;
    static final int MASK_CHANNEL_UNREGISTERED = 1 << 2;
    static final int MASK_CHANNEL_ACTIVE = 1 << 3;
    static final int MASK_CHANNEL_INACTIVE = 1 << 4;
    static final int MASK_CHANNEL_READ = 1 << 5;
    static final int MASK_CHANNEL_READ_COMPLETE = 1 << 6;
    static final int MASK_USER_EVENT_TRIGGERED = 1 << 7;
    static final int MASK_CHANNEL_WRITABILITY_CHANGED = 1 << 8;
    static final int MASK_BIND = 1 << 9;
    static final int MASK_CONNECT = 1 << 10;
    static final int MASK_DISCONNECT = 1 << 11;
    static final int MASK_CLOSE = 1 << 12;
    static final int MASK_DEREGISTER = 1 << 13;
    static final int MASK_READ = 1 << 14;
    static final int MASK_WRITE = 1 << 15;
    static final int MASK_FLUSH = 1 << 16;

    static final int MASK_ONLY_INBOUND =  MASK_CHANNEL_REGISTERED |
            MASK_CHANNEL_UNREGISTERED | MASK_CHANNEL_ACTIVE | MASK_CHANNEL_INACTIVE | MASK_CHANNEL_READ |
            MASK_CHANNEL_READ_COMPLETE | MASK_USER_EVENT_TRIGGERED | MASK_CHANNEL_WRITABILITY_CHANGED;
    private static final int MASK_ALL_INBOUND = MASK_EXCEPTION_CAUGHT | MASK_ONLY_INBOUND;
    static final int MASK_ONLY_OUTBOUND =  MASK_BIND | MASK_CONNECT | MASK_DISCONNECT |
            MASK_CLOSE | MASK_DEREGISTER | MASK_READ | MASK_WRITE | MASK_FLUSH;
    private static final int MASK_ALL_OUTBOUND = MASK_EXCEPTION_CAUGHT | MASK_ONLY_OUTBOUND;

    private static final FastThreadLocal<Map<Class<? extends ChannelHandler>, Integer>> MASKS =
            new FastThreadLocal<Map<Class<? extends ChannelHandler>, Integer>>() {
                @Override
                protected Map<Class<? extends ChannelHandler>, Integer> initialValue() {
                    return new WeakHashMap<Class<? extends ChannelHandler>, Integer>(32);
                }
            };

    /**
     * Return the {@code executionMask}.
     */
    static int mask(Class<? extends ChannelHandler> clazz) {
        // Try to obtain the mask from the cache first. If this fails calculate it and put it in the cache for fast
        // lookup in the future.
        Map<Class<? extends ChannelHandler>, Integer> cache = MASKS.get();
        Integer mask = cache.get(clazz);
        if (mask == null) {
            mask = mask0(clazz);
            cache.put(clazz, mask);
        }
        return mask;
    }

    /**
     * Calculate the {@code executionMask}.
     */
    private static int mask0(Class<? extends ChannelHandler> handlerType) {
        int mask = MASK_EXCEPTION_CAUGHT;
        try {
            if (ChannelInboundHandler.class.isAssignableFrom(handlerType)) {
                mask |= MASK_ALL_INBOUND;

                if (isSkippable(handlerType, "channelRegistered", ChannelHandlerContext.class)) {
                    mask &= ~MASK_CHANNEL_REGISTERED;
                }
                if (isSkippable(handlerType, "channelUnregistered", ChannelHandlerContext.class)) {
                    mask &= ~MASK_CHANNEL_UNREGISTERED;
                }
                if (isSkippable(handlerType, "channelActive", ChannelHandlerContext.class)) {
                    mask &= ~MASK_CHANNEL_ACTIVE;
                }
                if (isSkippable(handlerType, "channelInactive", ChannelHandlerContext.class)) {
                    mask &= ~MASK_CHANNEL_INACTIVE;
                }
                if (isSkippable(handlerType, "channelRead", ChannelHandlerContext.class, Object.class)) {
                    mask &= ~MASK_CHANNEL_READ;
                }
                if (isSkippable(handlerType, "channelReadComplete", ChannelHandlerContext.class)) {
                    mask &= ~MASK_CHANNEL_READ_COMPLETE;
                }
                if (isSkippable(handlerType, "channelWritabilityChanged", ChannelHandlerContext.class)) {

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free