diff --git a/thread-pool.c b/thread-pool.c index 7895544..72be971 100644 --- a/thread-pool.c +++ b/thread-pool.c @@ -71,20 +72,16 @@ static void *worker_thread(void *unused) ThreadPoolElement *req; int ret; - qemu_mutex_lock(&lock); - idle_threads++; - qemu_mutex_unlock(&lock); - ret = qemu_sem_timedwait(&sem, 10000); - qemu_mutex_lock(&lock); - idle_threads--; + atomic_inc(&idle_threads); + do { + ret = qemu_sem_timedwait(&sem, 10000); + } while (ret == -1 && atomic_read(&QTAILQ_FIRST(&request_list)) != NULL); + atomic_dec(&idle_threads); if (ret == -1) { - if (QTAILQ_EMPTY(&request_list)) { - break; - } - qemu_mutex_unlock(&lock); - continue; + break; } + qemu_mutex_lock(&lock); req = QTAILQ_FIRST(&request_list); QTAILQ_REMOVE(&request_list, req, reqs); req->state = THREAD_ACTIVE; @@ -226,7 +223,7 @@ BlockDriverAIOCB *thread_pool_submit_aio(ThreadPoolFunc *func, void *arg, trace_thread_pool_submit(req, arg); qemu_mutex_lock(&lock); - if (idle_threads == 0 && cur_threads < max_threads) { + if (atomic_read(&idle_threads) == 0 && cur_threads < max_threads) { spawn_thread(); } QTAILQ_INSERT_TAIL(&request_list, req, reqs);