http2: remove stream dependency tracking
No binary (build failed)
—
(log yok)
| @@ -1165,11 +1165,12 @@ Redirect stderr to another stream. See CURLOPT_STDERR(3) | |
| ## CURLOPT_STREAM_DEPENDS | |
| - | This HTTP/2 stream depends on another. See CURLOPT_STREAM_DEPENDS(3) |
| + | **Deprecated option** This HTTP/2 stream depends on another. See |
| + | CURLOPT_STREAM_DEPENDS(3) |
| ## CURLOPT_STREAM_DEPENDS_E | |
| - | This HTTP/2 stream depends on another exclusively. See |
| + | **Deprecated option** This HTTP/2 stream depends on another exclusively. See |
| CURLOPT_STREAM_DEPENDS_E(3) | |
| ## CURLOPT_STREAM_WEIGHT | |
| @@ -44,6 +44,10 @@ an error. It must be another easy handle, and it also needs to be a handle of | |
| a transfer that is about to be sent over the same HTTP/2 connection for this | |
| option to have an actual effect. | |
| + | Since version 8.21.0 setting this option no longer has an effect. HTTP/2 |
| + | stream dependencies were introduced in RFC 7540 and then later deprecated |
| + | in RFC 9113. |
| + | |
| # DEFAULT | |
| NULL | |
| @@ -69,6 +73,10 @@ int main(void) | |
| } | |
| ~~~ | |
| + | # DEPRECATED |
| + | |
| + | Deprecated since 8.21.0. |
| + | |
| # %AVAILABILITY% | |
| # RETURN VALUE | |
| @@ -47,6 +47,10 @@ an error. It must be another easy handle, and it also needs to be a handle of | |
| a transfer that is about to be sent over the same HTTP/2 connection for this | |
| option to have an actual effect. | |
| + | Since version 8.21.0 setting this option no longer has an effect. HTTP/2 |
| + | stream dependencies were introduced in RFC 7540 and then later deprecated |
| + | in RFC 9113. |
| + | |
| # DEFAULT | |
| NULL | |
| @@ -72,6 +76,10 @@ int main(void) | |
| } | |
| ~~~ | |
| + | # DEPRECATED |
| + | |
| + | Deprecated since 8.21.0. |
| + | |
| # %AVAILABILITY% | |
| # RETURN VALUE | |
| @@ -882,8 +882,8 @@ CURLOPT_SSLKEYPASSWD 7.9.3 7.17.0 | |
| CURLOPT_SSLKEYTYPE 7.9.3 | |
| CURLOPT_SSLVERSION 7.1 | |
| CURLOPT_STDERR 7.1 | |
| - | CURLOPT_STREAM_DEPENDS 7.46.0 |
| - | CURLOPT_STREAM_DEPENDS_E 7.46.0 |
| + | CURLOPT_STREAM_DEPENDS 7.46.0 8.21.0 |
| + | CURLOPT_STREAM_DEPENDS_E 7.46.0 8.21.0 |
| CURLOPT_STREAM_WEIGHT 7.46.0 | |
| CURLOPT_SUPPRESS_CONNECT_HEADERS 7.54.0 | |
| CURLOPT_TCP_FASTOPEN 7.49.0 | |
| @@ -1985,10 +1985,12 @@ typedef enum { | |
| CURLOPT(CURLOPT_STREAM_WEIGHT, CURLOPTTYPE_LONG, 239), | |
| /* Set stream dependency on another curl handle */ | |
| - | CURLOPT(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240), |
| + | CURLOPTDEPRECATED(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240, |
| + | 8.21.0, "Has no function"), |
| /* Set E-xclusive stream dependency on another curl handle */ | |
| - | CURLOPT(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241), |
| + | CURLOPTDEPRECATED(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241, |
| + | 8.21.0, "Has no function"), |
| /* Do not send any tftp option requests to the server */ | |
| CURLOPT(CURLOPT_TFTP_NO_OPTIONS, CURLOPTTYPE_LONG, 242), | |
| @@ -1778,16 +1778,12 @@ static int sweight_in_effect(const struct Curl_easy *data) | |
| * struct. | |
| */ | |
| - | static void h2_pri_spec(struct cf_h2_ctx *ctx, |
| - | struct Curl_easy *data, |
| + | static void h2_pri_spec(struct Curl_easy *data, |
| nghttp2_priority_spec *pri_spec) | |
| { | |
| struct Curl_data_priority *prio = &data->set.priority; | |
| - | struct h2_stream_ctx *depstream = H2_STREAM_CTX(ctx, prio->parent); |
| - | int32_t depstream_id = depstream ? depstream->id : 0; |
| - | nghttp2_priority_spec_init(pri_spec, depstream_id, |
| - | sweight_wanted(data), |
| - | data->set.priority.exclusive); |
| + | nghttp2_priority_spec_init(pri_spec, 0, |
| + | sweight_wanted(data), FALSE); |
| data->state.priority = *prio; | |
| } | |
| @@ -1805,13 +1801,11 @@ static CURLcode h2_progress_egress(struct Curl_cfilter *cf, | |
| int rv = 0; | |
| if(stream && stream->id > 0 && | |
| - | ((sweight_wanted(data) != sweight_in_effect(data)) || |
| - | (data->set.priority.exclusive != data->state.priority.exclusive) || |
| - | (data->set.priority.parent != data->state.priority.parent))) { |
| + | (sweight_wanted(data) != sweight_in_effect(data))) { |
| /* send new weight and/or dependency */ | |
| nghttp2_priority_spec pri_spec; | |
| - | h2_pri_spec(ctx, data, &pri_spec); |
| + | h2_pri_spec(data, &pri_spec); |
| CURL_TRC_CF(data, cf, "[%d] Queuing PRIORITY", stream->id); | |
| DEBUGASSERT(stream->id != -1); | |
| rv = nghttp2_submit_priority(ctx->h2, NGHTTP2_FLAG_NONE, | |
| @@ -2123,7 +2117,7 @@ static CURLcode h2_submit(struct h2_stream_ctx **pstream, | |
| goto out; | |
| } | |
| - | h2_pri_spec(ctx, data, &pri_spec); |
| + | h2_pri_spec(data, &pri_spec); |
| if(!nghttp2_session_check_request_allowed(ctx->h2)) | |
| CURL_TRC_CF(data, cf, "send request NOT allowed (via nghttp2)"); | |
| @@ -1527,13 +1527,10 @@ static CURLcode setopt_pointers(struct Curl_easy *data, CURLoption option, | |
| #ifdef USE_HTTP2 | |
| case CURLOPT_STREAM_DEPENDS: | |
| - | case CURLOPT_STREAM_DEPENDS_E: { |
| - | struct Curl_easy *dep = va_arg(param, struct Curl_easy *); |
| - | if(!dep || GOOD_EASY_HANDLE(dep)) |
| - | return Curl_data_priority_add_child(dep, data, |
| - | option == CURLOPT_STREAM_DEPENDS_E); |
| + | case CURLOPT_STREAM_DEPENDS_E: |
| + | /* not doing stream dependencies any longer, but accept options |
| + | * for backward compatibility */ |
| break; | |
| - | } |
| #endif | |
| default: | |
| @@ -119,12 +119,6 @@ | |
| #include "smtp.h" | |
| #include "ws.h" | |
| - | #ifdef USE_NGHTTP2 |
| - | static void data_priority_cleanup(struct Curl_easy *data); |
| - | #else |
| - | #define data_priority_cleanup(x) |
| - | #endif |
| - | |
| /* Some parts of the code (e.g. chunked encoding) assume this buffer has more | |
| * than a few bytes to play with. Do not let it become too small or bad things | |
| * will happen. | |
| @@ -275,8 +269,6 @@ CURLcode Curl_close(struct Curl_easy **datap) | |
| curlx_safefree(data->info.contenttype); | |
| curlx_safefree(data->info.wouldredirect); | |
| - | data_priority_cleanup(data); |
| - | |
| /* No longer a dirty share, if it exists */ | |
| if(Curl_share_easy_unlink(data)) | |
| DEBUGASSERT(0); | |
| @@ -3009,96 +3001,6 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn) | |
| #if defined(USE_HTTP2) || defined(USE_HTTP3) | |
| - | #ifdef USE_NGHTTP2 |
| - | |
| - | static void priority_remove_child(struct Curl_easy *parent, |
| - | struct Curl_easy *child) |
| - | { |
| - | struct Curl_data_prio_node **pnext = &parent->set.priority.children; |
| - | struct Curl_data_prio_node *pnode = parent->set.priority.children; |
| - | |
| - | DEBUGASSERT(child->set.priority.parent == parent); |
| - | while(pnode && pnode->data != child) { |
| - | pnext = &pnode->next; |
| - | pnode = pnode->next; |
| - | } |
| - | |
| - | DEBUGASSERT(pnode); |
| - | if(pnode) { |
| - | *pnext = pnode->next; |
| - | curlx_free(pnode); |
| - | } |
| - | |
| - | child->set.priority.parent = 0; |
| - | child->set.priority.exclusive = FALSE; |
| - | } |
| - | |
| - | CURLcode Curl_data_priority_add_child(struct Curl_easy *parent, |
| - | struct Curl_easy *child, |
| - | bool exclusive) |
| - | { |
| - | if(child->set.priority.parent) { |
| - | priority_remove_child(child->set.priority.parent, child); |
| - | } |
| - | |
| - | if(parent) { |
| - | struct Curl_data_prio_node **tail; |
| - | struct Curl_data_prio_node *pnode; |
| - | |
| - | pnode = curlx_calloc(1, sizeof(*pnode)); |
| - | if(!pnode) |
| - | return CURLE_OUT_OF_MEMORY; |
| - | pnode->data = child; |
| - | |
| - | if(parent->set.priority.children && exclusive) { |
| - | /* exclusive: move all existing children underneath the new child */ |
| - | struct Curl_data_prio_node *node = parent->set.priority.children; |
| - | while(node) { |
| - | node->data->set.priority.parent = child; |
| - | node = node->next; |
| - | } |
| - | |
| - | tail = &child->set.priority.children; |
| - | while(*tail) |
| - | tail = &(*tail)->next; |
| - | |
| - | DEBUGASSERT(!*tail); |
| - | *tail = parent->set.priority.children; |
| - | parent->set.priority.children = 0; |
| - | } |
| - | |
| - | tail = &parent->set.priority.children; |
| - | while(*tail) { |
| - | (*tail)->data->set.priority.exclusive = FALSE; |
| - | tail = &(*tail)->next; |
| - | } |
| - | |
| - | DEBUGASSERT(!*tail); |
| - | *tail = pnode; |
| - | } |
| - | |
| - | child->set.priority.parent = parent; |
| - | child->set.priority.exclusive = exclusive; |
| - | return CURLE_OK; |
| - | } |
| - | |
| - | #endif /* USE_NGHTTP2 */ |
| - | |
| - | #ifdef USE_NGHTTP2 |
| - | static void data_priority_cleanup(struct Curl_easy *data) |
| - | { |
| - | while(data->set.priority.children) { |
| - | struct Curl_easy *tmp = data->set.priority.children->data; |
| - | priority_remove_child(data, tmp); |
| - | if(data->set.priority.parent) |
| - | Curl_data_priority_add_child(data->set.priority.parent, tmp, FALSE); |
| - | } |
| - | |
| - | if(data->set.priority.parent) |
| - | priority_remove_child(data->set.priority.parent, data); |
| - | } |
| - | #endif |
| - | |
| void Curl_data_priority_clear_state(struct Curl_easy *data) | |
| { | |
| memset(&data->state.priority, 0, sizeof(data->state.priority)); | |
| @@ -592,15 +592,7 @@ struct Curl_data_prio_node { | |
| * on the same connection. | |
| */ | |
| struct Curl_data_priority { | |
| - | #ifdef USE_NGHTTP2 |
| - | /* tree like dependencies only implemented in nghttp2 */ |
| - | struct Curl_easy *parent; |
| - | struct Curl_data_prio_node *children; |
| - | #endif |
| int weight; | |
| - | #ifdef USE_NGHTTP2 |
| - | BIT(exclusive); |
| - | #endif |
| }; | |
| /* Timers */ | |