Revision c84dcdc1 block/curl.c
b/block/curl.c | ||
---|---|---|
76 | 76 |
|
77 | 77 |
static void curl_clean_state(CURLState *s); |
78 | 78 |
static void curl_multi_do(void *arg); |
79 |
static int curl_aio_flush(void *opaque); |
|
79 | 80 |
|
80 | 81 |
static int curl_sock_cb(CURL *curl, curl_socket_t fd, int action, |
81 | 82 |
void *s, void *sp) |
... | ... | |
83 | 84 |
DPRINTF("CURL (AIO): Sock action %d on fd %d\n", action, fd); |
84 | 85 |
switch (action) { |
85 | 86 |
case CURL_POLL_IN: |
86 |
qemu_aio_set_fd_handler(fd, curl_multi_do, NULL, NULL, NULL, s); |
|
87 |
qemu_aio_set_fd_handler(fd, curl_multi_do, NULL, curl_aio_flush, |
|
88 |
NULL, s); |
|
87 | 89 |
break; |
88 | 90 |
case CURL_POLL_OUT: |
89 |
qemu_aio_set_fd_handler(fd, NULL, curl_multi_do, NULL, NULL, s); |
|
91 |
qemu_aio_set_fd_handler(fd, NULL, curl_multi_do, curl_aio_flush, |
|
92 |
NULL, s); |
|
90 | 93 |
break; |
91 | 94 |
case CURL_POLL_INOUT: |
92 |
qemu_aio_set_fd_handler(fd, curl_multi_do, |
|
93 |
curl_multi_do, NULL, NULL, s);
|
|
95 |
qemu_aio_set_fd_handler(fd, curl_multi_do, curl_multi_do,
|
|
96 |
curl_aio_flush, NULL, s);
|
|
94 | 97 |
break; |
95 | 98 |
case CURL_POLL_REMOVE: |
96 | 99 |
qemu_aio_set_fd_handler(fd, NULL, NULL, NULL, NULL, NULL); |
... | ... | |
412 | 415 |
return -EINVAL; |
413 | 416 |
} |
414 | 417 |
|
418 |
static int curl_aio_flush(void *opaque) |
|
419 |
{ |
|
420 |
BDRVCURLState *s = opaque; |
|
421 |
int i, j; |
|
422 |
|
|
423 |
for (i=0; i < CURL_NUM_STATES; i++) { |
|
424 |
for(j=0; j < CURL_NUM_ACB; j++) { |
|
425 |
if (s->states[i].acb[j]) { |
|
426 |
return 1; |
|
427 |
} |
|
428 |
} |
|
429 |
} |
|
430 |
return 0; |
|
431 |
} |
|
432 |
|
|
415 | 433 |
static void curl_aio_cancel(BlockDriverAIOCB *blockacb) |
416 | 434 |
{ |
417 | 435 |
// Do we have to implement canceling? Seems to work without... |
Also available in: Unified diff