From: Daniel Stenberg Date: Tue, 3 Jul 2018 23:20:31 +0000 (+0200) Subject: Curl_getoff_all_pipelines: improved for multiplexed X-Git-Tag: curl-7_61_1~145 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=151d3c56dcadc6b04508bdcb85acf2f0f96e4aff;p=thirdparty%2Fcurl.git Curl_getoff_all_pipelines: improved for multiplexed On multiplexed connections, transfers can be removed from anywhere not just at the head as for pipelines. --- diff --git a/lib/url.c b/lib/url.c index b81174497a..f5a5e95864 100644 --- a/lib/url.c +++ b/lib/url.c @@ -851,6 +851,7 @@ static int IsPipeliningPossible(const struct Curl_easy *handle, return avail; } +/* Returns non-zero if a handle was removed */ int Curl_removeHandleFromPipeline(struct Curl_easy *handle, struct curl_llist *pipeline) { @@ -899,15 +900,24 @@ static struct Curl_easy* gethandleathead(struct curl_llist *pipeline) void Curl_getoff_all_pipelines(struct Curl_easy *data, struct connectdata *conn) { - bool recv_head = (conn->readchannel_inuse && - Curl_recvpipe_head(data, conn)); - bool send_head = (conn->writechannel_inuse && - Curl_sendpipe_head(data, conn)); - - if(Curl_removeHandleFromPipeline(data, &conn->recv_pipe) && recv_head) - Curl_pipeline_leave_read(conn); - if(Curl_removeHandleFromPipeline(data, &conn->send_pipe) && send_head) - Curl_pipeline_leave_write(conn); + if(!conn->bundle) + return; + if(conn->bundle->multiuse == BUNDLE_PIPELINING) { + bool recv_head = (conn->readchannel_inuse && + Curl_recvpipe_head(data, conn)); + bool send_head = (conn->writechannel_inuse && + Curl_sendpipe_head(data, conn)); + + if(Curl_removeHandleFromPipeline(data, &conn->recv_pipe) && recv_head) + Curl_pipeline_leave_read(conn); + if(Curl_removeHandleFromPipeline(data, &conn->send_pipe) && send_head) + Curl_pipeline_leave_write(conn); + } + else { + int rc; + rc = Curl_removeHandleFromPipeline(data, &conn->recv_pipe); + rc += Curl_removeHandleFromPipeline(data, &conn->send_pipe); + } } static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke)