1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-25 01:28:51 -05:00

Curl_getoff_all_pipelines: improved for multiplexed

On multiplexed connections, transfers can be removed from anywhere not
just at the head as for pipelines.
This commit is contained in:
Daniel Stenberg 2018-07-04 01:20:31 +02:00
parent c8373e3dfc
commit 151d3c56dc
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -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(!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);
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)