code: final void decodeRemovalReentryProtection(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
              throws Exception {
          decodeState = STATE_CALLING_CHILD_DECODE;
          try {
              decode(ctx, in, out);
          } finally {
              boolean removePending = decodeState == STATE_HANDLER_REMOVED_PENDING;
              decodeState = STATE_INIT;
              if (removePending) {
                  handlerRemoved(ctx);
              }
          }
      }
docs: Decode the from one {@link ByteBuf} to an other. This method will be called till either the input
  {@link ByteBuf} has nothing to read when return from this method or till nothing was read from the input
  {@link ByteBuf}.
  
  @param ctx           the {@link ChannelHandlerContext} which this {@link ByteToMessageDecoder} belongs to
  @param in            the {@link ByteBuf} from which to read data
  @param out           the {@link List} to which decoded messages should be added
  @throws Exception    is thrown if an error occurs