From 151d3c56dcadc6b04508bdcb85acf2f0f96e4aff Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 4 Jul 2018 01:20:31 +0200 Subject: Curl_getoff_all_pipelines: improved for multiplexed On multiplexed connections, transfers can be removed from anywhere not just at the head as for pipelines. --- lib/url.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'lib/url.c') diff --git a/lib/url.c b/lib/url.c index b81174497..f5a5e9586 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) -- cgit v1.2.3