summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2018-07-04 01:20:31 +0200
committerDaniel Stenberg <daniel@haxx.se>2018-07-11 23:41:24 +0200
commit151d3c56dcadc6b04508bdcb85acf2f0f96e4aff (patch)
treeea361a8daa7c95964f827353feed116d4f4e0d02
parentc8373e3dfc324e51f2221fefc4edff69d00f933c (diff)
downloadcurl-151d3c56dcadc6b04508bdcb85acf2f0f96e4aff.tar.gz
Curl_getoff_all_pipelines: improved for multiplexed
On multiplexed connections, transfers can be removed from anywhere not just at the head as for pipelines.
-rw-r--r--lib/url.c28
1 files changed, 19 insertions, 9 deletions
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)