[Qemu-block] [PATCH 5/5] curl: convert to CoQueue
Now that CoQueues can use a QemuMutex for thread-safety, there is no need for curl to roll its own coroutine queue. Coroutines can be placed directly on the queue instead of using a list of CURLAIOCBs. Reviewed-by: Stefan HajnocziSigned-off-by: Paolo Bonzini --- block/curl.c | 20 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/block/curl.c b/block/curl.c index 35cf417f59..cd578d3d14 100644 --- a/block/curl.c +++ b/block/curl.c @@ -101,8 +101,6 @@ typedef struct CURLAIOCB { size_t start; size_t end; - -QSIMPLEQ_ENTRY(CURLAIOCB) next; } CURLAIOCB; typedef struct CURLSocket { @@ -138,7 +136,7 @@ typedef struct BDRVCURLState { bool accept_range; AioContext *aio_context; QemuMutex mutex; -QSIMPLEQ_HEAD(, CURLAIOCB) free_state_waitq; +CoQueue free_state_waitq; char *username; char *password; char *proxyusername; @@ -538,7 +536,6 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state) /* Called with s->mutex held. */ static void curl_clean_state(CURLState *s) { -CURLAIOCB *next; int j; for (j = 0; j < CURL_NUM_ACB; j++) { assert(!s->acb[j]); @@ -556,13 +553,7 @@ static void curl_clean_state(CURLState *s) s->in_use = 0; -next = QSIMPLEQ_FIRST(>s->free_state_waitq); -if (next) { -QSIMPLEQ_REMOVE_HEAD(>s->free_state_waitq, next); -qemu_mutex_unlock(>s->mutex); -aio_co_wake(next->co); -qemu_mutex_lock(>s->mutex); -} +qemu_co_enter_next(>s->free_state_waitq, >s->mutex); } static void curl_parse_filename(const char *filename, QDict *options, @@ -784,7 +775,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags, } DPRINTF("CURL: Opening %s\n", file); -QSIMPLEQ_INIT(>free_state_waitq); +qemu_co_queue_init(>free_state_waitq); s->aio_context = bdrv_get_aio_context(bs); s->url = g_strdup(file); qemu_mutex_lock(>mutex); @@ -888,10 +879,7 @@ static void curl_setup_preadv(BlockDriverState *bs, CURLAIOCB *acb) if (state) { break; } -QSIMPLEQ_INSERT_TAIL(>free_state_waitq, acb, next); -qemu_mutex_unlock(>mutex); -qemu_coroutine_yield(); -qemu_mutex_lock(>mutex); +qemu_co_queue_wait(>free_state_waitq, >mutex); } if (curl_init_state(s, state) < 0) { -- 2.14.3
[Qemu-block] [PATCH 5/5] curl: convert to CoQueue
Now that CoQueues can use a QemuMutex for thread-safety, there is no need for curl to roll its own coroutine queue. Coroutines can be placed directly on the queue instead of using a list of CURLAIOCBs. Reviewed-by: Stefan HajnocziSigned-off-by: Paolo Bonzini --- block/curl.c | 20 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/block/curl.c b/block/curl.c index 35cf417f59..cd578d3d14 100644 --- a/block/curl.c +++ b/block/curl.c @@ -101,8 +101,6 @@ typedef struct CURLAIOCB { size_t start; size_t end; - -QSIMPLEQ_ENTRY(CURLAIOCB) next; } CURLAIOCB; typedef struct CURLSocket { @@ -138,7 +136,7 @@ typedef struct BDRVCURLState { bool accept_range; AioContext *aio_context; QemuMutex mutex; -QSIMPLEQ_HEAD(, CURLAIOCB) free_state_waitq; +CoQueue free_state_waitq; char *username; char *password; char *proxyusername; @@ -538,7 +536,6 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state) /* Called with s->mutex held. */ static void curl_clean_state(CURLState *s) { -CURLAIOCB *next; int j; for (j = 0; j < CURL_NUM_ACB; j++) { assert(!s->acb[j]); @@ -556,13 +553,7 @@ static void curl_clean_state(CURLState *s) s->in_use = 0; -next = QSIMPLEQ_FIRST(>s->free_state_waitq); -if (next) { -QSIMPLEQ_REMOVE_HEAD(>s->free_state_waitq, next); -qemu_mutex_unlock(>s->mutex); -aio_co_wake(next->co); -qemu_mutex_lock(>s->mutex); -} +qemu_co_enter_next(>s->free_state_waitq, >s->mutex); } static void curl_parse_filename(const char *filename, QDict *options, @@ -784,7 +775,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags, } DPRINTF("CURL: Opening %s\n", file); -QSIMPLEQ_INIT(>free_state_waitq); +qemu_co_queue_init(>free_state_waitq); s->aio_context = bdrv_get_aio_context(bs); s->url = g_strdup(file); qemu_mutex_lock(>mutex); @@ -888,10 +879,7 @@ static void curl_setup_preadv(BlockDriverState *bs, CURLAIOCB *acb) if (state) { break; } -QSIMPLEQ_INSERT_TAIL(>free_state_waitq, acb, next); -qemu_mutex_unlock(>mutex); -qemu_coroutine_yield(); -qemu_mutex_lock(>mutex); +qemu_co_queue_wait(>free_state_waitq, >mutex); } if (curl_init_state(s, state) < 0) { -- 2.14.3