]> granicus.if.org Git - curl/commitdiff
Curl_getoff_all_pipelines: improved for multiplexed
authorDaniel Stenberg <daniel@haxx.se>
Tue, 3 Jul 2018 23:20:31 +0000 (01:20 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 11 Jul 2018 21:41:24 +0000 (23:41 +0200)
On multiplexed connections, transfers can be removed from anywhere not
just at the head as for pipelines.

lib/url.c

index b81174497ac791d479e9749d8949c1af5f641aad..f5a5e9586460e92780751118bf7ad87ccfdb2048 100644 (file)
--- 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)