[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 30/31] curl: Ensure all informationals are checked fo
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 30/31] curl: Ensure all informationals are checked for completion |
Date: |
Wed, 30 Apr 2014 20:24:02 +0200 |
From: Matthew Booth <address@hidden>
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>
Tested-by: Richard W.M. Jones <address@hidden>
Signed-off-by: Kevin Wolf <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.8.3.1
- [Qemu-devel] [PULL 23/31] block/vdi: Error out immediately in vdi_create(), (continued)
- [Qemu-devel] [PULL 23/31] block/vdi: Error out immediately in vdi_create(), Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 22/31] block/bochs: Fix error handling for seek_to_sector(), Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 21/31] qcow2: Check min_size in qcow2_grow_l1_table(), Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 24/31] curl: Fix long line, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 26/31] curl: Fix return from curl_read_cb with invalid state, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 25/31] curl: Remove unnecessary use of goto, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 27/31] curl: Remove erroneous sleep waiting for curl completion, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 29/31] curl: Eliminate unnecessary use of curl_multi_socket_all, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 28/31] curl: Remove unnecessary explicit calls to internal event handler, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 31/31] curl: Fix hang reading from slow connections, Kevin Wolf, 2014/04/30
- [Qemu-devel] [PULL 30/31] curl: Ensure all informationals are checked for completion,
Kevin Wolf <=