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);
}
Source
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