提交 1f2cead3 编写于 作者: M Matthew Booth 提交者: Kevin Wolf

curl: Ensure all informationals are checked for completion

According to the documentation, the correct way to ensure all
informationals have been returned by curl_multi_info_read is to loop
until it returns NULL.
Signed-off-by: NMatthew Booth <mbooth@redhat.com>
Tested-by: NRichard W.M. Jones <rjones@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 838ef602
...@@ -248,46 +248,39 @@ static void curl_multi_check_completion(BDRVCURLState *s) ...@@ -248,46 +248,39 @@ static void curl_multi_check_completion(BDRVCURLState *s)
/* Try to find done transfers, so we can free the easy /* Try to find done transfers, so we can free the easy
* handle again. */ * handle again. */
do { for (;;) {
CURLMsg *msg; CURLMsg *msg;
msg = curl_multi_info_read(s->multi, &msgs_in_queue); msg = curl_multi_info_read(s->multi, &msgs_in_queue);
/* Quit when there are no more completions */
if (!msg) if (!msg)
break; break;
if (msg->msg == CURLMSG_NONE)
break;
switch (msg->msg) { if (msg->msg == CURLMSG_DONE) {
case CURLMSG_DONE: CURLState *state = NULL;
{ curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE,
CURLState *state = NULL; (char **)&state);
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE,
(char **)&state); /* ACBs for successful messages get completed in curl_read_cb */
if (msg->data.result != CURLE_OK) {
/* ACBs for successful messages get completed in curl_read_cb */ int i;
if (msg->data.result != CURLE_OK) { for (i = 0; i < CURL_NUM_ACB; i++) {
int i; CURLAIOCB *acb = state->acb[i];
for (i = 0; i < CURL_NUM_ACB; i++) {
CURLAIOCB *acb = state->acb[i]; if (acb == NULL) {
continue;
if (acb == NULL) {
continue;
}
acb->common.cb(acb->common.opaque, -EIO);
qemu_aio_release(acb);
state->acb[i] = NULL;
} }
}
curl_clean_state(state); acb->common.cb(acb->common.opaque, -EIO);
break; qemu_aio_release(acb);
state->acb[i] = NULL;
}
} }
default:
msgs_in_queue = 0; curl_clean_state(state);
break; break;
} }
} while(msgs_in_queue); }
} }
static void curl_multi_do(void *arg) static void curl_multi_do(void *arg)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册