Home / Class/ QuicChannelUnsafe Class — netty Architecture

QuicChannelUnsafe Class — netty Architecture

Architecture documentation for the QuicChannelUnsafe class in QuicheQuicChannel.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4["QuicChannelUnsafe"]
  e2af940f_f48c_60ab_e67f_c3708214d676["QuicheQuicChannel.java"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|defined in| e2af940f_f48c_60ab_e67f_c3708214d676
  856d3247_b041_f0ac_0c9b_22f9f2349213["connectStream()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| 856d3247_b041_f0ac_0c9b_22f9f2349213
  dd994d52_4bd9_455c_0f5d_835ec81290b1["connect()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| dd994d52_4bd9_455c_0f5d_835ec81290b1
  ef304e25_a25b_693c_82b3_0eb2c9334eb7["fireConnectCloseEventIfNeeded()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| ef304e25_a25b_693c_82b3_0eb2c9334eb7
  c4a3c3a8_c9a0_f1c5_a6e4_d976b89450ea["connectionRecv()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| c4a3c3a8_c9a0_f1c5_a6e4_d976b89450ea
  4cae79d3_92ee_29bb_03d0_6a120cc97031["processReceived()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| 4cae79d3_92ee_29bb_03d0_6a120cc97031
  e06a1624_97e7_719b_83f4_41463045636c["handlePathEvents()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| e06a1624_97e7_719b_83f4_41463045636c
  a8038ede_896d_5400_e9da_e2e5c976508f["runAllTaskRecv()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| a8038ede_896d_5400_e9da_e2e5c976508f
  f272787f_620b_08bb_a796_d28ea6137125["Runnable()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| f272787f_620b_08bb_a796_d28ea6137125
  0e1ca299_ed3d_8a6d_bf55_50ab173c29d7["recv()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| 0e1ca299_ed3d_8a6d_bf55_50ab173c29d7
  4c5c4c1a_01ba_f361_2baa_f00270cfb942["recvStream()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| 4c5c4c1a_01ba_f361_2baa_f00270cfb942
  7ed04228_8203_18ea_57b2_766b3ee23bb7["recvDatagram()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| 7ed04228_8203_18ea_57b2_766b3ee23bb7
  a4b4fcaa_9db9_acca_39f7_249f845a6b78["handlePendingChannelActive()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| a4b4fcaa_9db9_acca_39f7_249f845a6b78
  b45b198f_1210_5e2e_4da0_b84aa6357bd6["fireDatagramExtensionEvent()"]
  981bac79_4fa5_9e57_50c8_e12d0b35f6d4 -->|method| b45b198f_1210_5e2e_4da0_b84aa6357bd6

Relationship Graph

Source Code

codec-classes-quic/src/main/java/io/netty/handler/codec/quic/QuicheQuicChannel.java lines 1486–1970

    private final class QuicChannelUnsafe extends AbstractChannel.AbstractUnsafe {

        void connectStream(QuicStreamType type, @Nullable ChannelHandler handler,
                           Promise<QuicStreamChannel> promise) {
            if (!promise.setUncancellable()) {
                return;
            }
            long streamId = idGenerator.nextStreamId(type == QuicStreamType.BIDIRECTIONAL);

            try {
                int res = streamSend0(connection, streamId, Unpooled.EMPTY_BUFFER, false);
                if (res < 0 && res != Quiche.QUICHE_ERR_DONE) {
                    throw Quiche.convertToException(res);
                }
            } catch (Exception e) {
                promise.setFailure(e);
                return;
            }
            if (type == QuicStreamType.UNIDIRECTIONAL) {
                UNI_STREAMS_LEFT_UPDATER.decrementAndGet(QuicheQuicChannel.this);
            } else {
                BIDI_STREAMS_LEFT_UPDATER.decrementAndGet(QuicheQuicChannel.this);
            }
            QuicheQuicStreamChannel streamChannel = addNewStreamChannel(streamId);
            if (handler != null) {
                streamChannel.pipeline().addLast(handler);
            }
            eventLoop().register(streamChannel).addListener((ChannelFuture f) -> {
                if (f.isSuccess()) {
                    promise.setSuccess(streamChannel);
                } else {
                    promise.setFailure(f.cause());
                    streams.remove(streamId);
                }
            });
        }

        @Override
        public void connect(SocketAddress remote, SocketAddress local, ChannelPromise channelPromise) {
            assert eventLoop().inEventLoop();
            if (!channelPromise.setUncancellable()) {
                return;
            }
            if (server) {
                channelPromise.setFailure(new UnsupportedOperationException());
                return;
            }

            if (connectPromise != null) {
                channelPromise.setFailure(new ConnectionPendingException());
                return;
            }

            if (remote instanceof QuicConnectionAddress) {
                if (!sourceConnectionIds.isEmpty()) {
                    // If a key is assigned we know this channel was already connected.
                    channelPromise.setFailure(new AlreadyConnectedException());
                    return;
                }

                connectAddress = (QuicConnectionAddress) remote;
                connectPromise = channelPromise;

                // Schedule connect timeout.
                int connectTimeoutMillis = config().getConnectTimeoutMillis();
                if (connectTimeoutMillis > 0) {
                    connectTimeoutFuture = eventLoop().schedule(() -> {
                        ChannelPromise connectPromise = QuicheQuicChannel.this.connectPromise;
                        if (connectPromise != null && !connectPromise.isDone()
                                && connectPromise.tryFailure(new ConnectTimeoutException(
                                "connection timed out: " + remote))) {
                            close(voidPromise());
                        }
                    }, connectTimeoutMillis, TimeUnit.MILLISECONDS);
                }

                connectPromise.addListener((ChannelFuture future) -> {
                    if (future.isCancelled()) {
                        if (connectTimeoutFuture != null) {
                            connectTimeoutFuture.cancel(false);
                        }

Frequently Asked Questions

What is the QuicChannelUnsafe class?
QuicChannelUnsafe is a class in the netty codebase, defined in codec-classes-quic/src/main/java/io/netty/handler/codec/quic/QuicheQuicChannel.java.
Where is QuicChannelUnsafe defined?
QuicChannelUnsafe is defined in codec-classes-quic/src/main/java/io/netty/handler/codec/quic/QuicheQuicChannel.java at line 1486.

Analyze Your Own Codebase

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

Try Supermodel Free