[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/8] curl: Ensure all informationals are checked for
From: |
Matthew Booth |
Subject: |
[Qemu-devel] [PATCH 7/8] curl: Ensure all informationals are checked for completion |
Date: |
Tue, 29 Apr 2014 16:03:31 +0100 |
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: Matthew Booth <address@hidden>
---
block/curl.c | 53 +++++++++++++++++++++++------------------------------
1 file changed, 23 insertions(+), 30 deletions(-)
diff --git a/block/curl.c b/block/curl.c
index f3a4445..16e7db8 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -248,46 +248,39 @@ static void curl_multi_check_completion(BDRVCURLState *s)
/* Try to find done transfers, so we can free the easy
* handle again. */
- do {
+ for (;;) {
CURLMsg *msg;
msg = curl_multi_info_read(s->multi, &msgs_in_queue);
+ /* Quit when there are no more completions */
if (!msg)
break;
- if (msg->msg == CURLMSG_NONE)
- break;
- switch (msg->msg) {
- case CURLMSG_DONE:
- {
- CURLState *state = NULL;
- 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) {
- int i;
- for (i = 0; i < CURL_NUM_ACB; i++) {
- CURLAIOCB *acb = state->acb[i];
-
- if (acb == NULL) {
- continue;
- }
-
- acb->common.cb(acb->common.opaque, -EIO);
- qemu_aio_release(acb);
- state->acb[i] = NULL;
+ if (msg->msg == CURLMSG_DONE) {
+ CURLState *state = NULL;
+ 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) {
+ int i;
+ for (i = 0; i < CURL_NUM_ACB; i++) {
+ CURLAIOCB *acb = state->acb[i];
+
+ if (acb == NULL) {
+ continue;
}
- }
- curl_clean_state(state);
- break;
+ acb->common.cb(acb->common.opaque, -EIO);
+ qemu_aio_release(acb);
+ state->acb[i] = NULL;
+ }
}
- default:
- msgs_in_queue = 0;
- break;
+
+ curl_clean_state(state);
+ break;
}
- } while(msgs_in_queue);
+ }
}
static void curl_multi_do(void *arg)
--
1.9.0
- [Qemu-devel] [PATCH 0/8] curl: Fix hang reading from slow connections, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 1/8] curl: Fix long line, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 2/8] curl: Remove unnecessary use of goto, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 5/8] curl: Remove unnecessary explicit calls to internal event handler, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 4/8] curl: Remove erroneous sleep waiting for curl completion, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 7/8] curl: Ensure all informationals are checked for completion,
Matthew Booth <=
- [Qemu-devel] [PATCH 3/8] curl: Fix return from curl_read_cb with invalid state, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 6/8] curl: Eliminate unnecessary use of curl_multi_socket_all, Matthew Booth, 2014/04/29
- [Qemu-devel] [PATCH 8/8] curl: Fix hang reading from slow connections, Matthew Booth, 2014/04/29
- Re: [Qemu-devel] [PATCH 0/8] curl: Fix hang reading from slow connections, Richard W.M. Jones, 2014/04/29
- Re: [Qemu-devel] [PATCH 0/8] curl: Fix hang reading from slow connections, Kevin Wolf, 2014/04/30