From: Stefan Eissing Date: Fri, 7 Mar 2025 09:17:25 +0000 (+0100) Subject: ngtcp2: do not iterate over multi handles X-Git-Tag: curl-8_13_0~230 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0d1e43af8dccd18b84b46f7bc7a5d57a2bc1ff11;p=thirdparty%2Fcurl.git ngtcp2: do not iterate over multi handles There was on place left iterating over `multi->process` list which was unnecessary. Remove that. Closes #16606 --- diff --git a/lib/vquic/curl_ngtcp2.c b/lib/vquic/curl_ngtcp2.c index 20670a2ec7..427fd11e80 100644 --- a/lib/vquic/curl_ngtcp2.c +++ b/lib/vquic/curl_ngtcp2.c @@ -297,38 +297,6 @@ static void h3_data_done(struct Curl_cfilter *cf, struct Curl_easy *data) } } -static struct Curl_easy *get_stream_easy(struct Curl_cfilter *cf, - struct Curl_easy *data, - int64_t stream_id, - struct h3_stream_ctx **pstream) -{ - struct cf_ngtcp2_ctx *ctx = cf->ctx; - struct h3_stream_ctx *stream; - - (void)cf; - stream = H3_STREAM_CTX(ctx, data); - if(stream && stream->id == stream_id) { - *pstream = stream; - return data; - } - else { - struct Curl_llist_node *e; - DEBUGASSERT(data->multi); - for(e = Curl_llist_head(&data->multi->process); e; e = Curl_node_next(e)) { - struct Curl_easy *sdata = Curl_node_elem(e); - if(sdata->conn != data->conn) - continue; - stream = H3_STREAM_CTX(ctx, sdata); - if(stream && stream->id == stream_id) { - *pstream = stream; - return sdata; - } - } - } - *pstream = NULL; - return NULL; -} - static void h3_drain_stream(struct Curl_cfilter *cf, struct Curl_easy *data) { @@ -710,28 +678,26 @@ static int cb_extend_max_local_streams_bidi(ngtcp2_conn *tconn, return 0; } -static int cb_extend_max_stream_data(ngtcp2_conn *tconn, int64_t sid, +static int cb_extend_max_stream_data(ngtcp2_conn *tconn, int64_t stream_id, uint64_t max_data, void *user_data, void *stream_user_data) { struct Curl_cfilter *cf = user_data; struct cf_ngtcp2_ctx *ctx = cf->ctx; - curl_int64_t stream_id = (curl_int64_t)sid; - struct Curl_easy *data = CF_DATA_CURRENT(cf); - struct Curl_easy *s_data; + struct Curl_easy *s_data = stream_user_data; struct h3_stream_ctx *stream; int rv; (void)tconn; (void)max_data; - (void)stream_user_data; rv = nghttp3_conn_unblock_stream(ctx->h3conn, stream_id); if(rv && rv != NGHTTP3_ERR_STREAM_NOT_FOUND) { return NGTCP2_ERR_CALLBACK_FAILURE; } - s_data = get_stream_easy(cf, data, stream_id, &stream); - if(s_data && stream && stream->quic_flow_blocked) { - CURL_TRC_CF(s_data, cf, "[%" FMT_PRId64 "] unblock quic flow", stream_id); + stream = H3_STREAM_CTX(ctx, s_data); + if(stream && stream->quic_flow_blocked) { + CURL_TRC_CF(s_data, cf, "[%" FMT_PRId64 "] unblock quic flow", + (curl_int64_t)stream_id); stream->quic_flow_blocked = FALSE; h3_drain_stream(cf, s_data); }