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