Comments
Patch
@@ -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);