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)) {
Source
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