migration: Multifd channels always wait on the sem

Either for quit, sync or packet, we first wake them.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Juan Quintela 2018-04-11 02:44:24 +02:00
parent 408ea6ae4c
commit d82628e4bd
1 changed files with 11 additions and 2 deletions

View File

@ -875,6 +875,7 @@ static void *multifd_send_thread(void *opaque)
p->num_packets = 1;
while (true) {
qemu_sem_wait(&p->sem);
qemu_mutex_lock(&p->mutex);
multifd_send_fill_packet(p);
if (p->quit) {
@ -882,7 +883,9 @@ static void *multifd_send_thread(void *opaque)
break;
}
qemu_mutex_unlock(&p->mutex);
qemu_sem_wait(&p->sem);
/* this is impossible */
error_setg(&local_err, "multifd_send_thread: Unknown command");
break;
}
out:
@ -1026,6 +1029,7 @@ static void *multifd_recv_thread(void *opaque)
trace_multifd_recv_thread_start(p->id);
while (true) {
qemu_sem_wait(&p->sem);
qemu_mutex_lock(&p->mutex);
if (false) {
/* ToDo: Packet reception goes here */
@ -1040,9 +1044,14 @@ static void *multifd_recv_thread(void *opaque)
break;
}
qemu_mutex_unlock(&p->mutex);
qemu_sem_wait(&p->sem);
/* this is impossible */
error_setg(&local_err, "multifd_recv_thread: Unknown command");
break;
}
if (local_err) {
multifd_recv_terminate_threads(local_err);
}
qemu_mutex_lock(&p->mutex);
p->running = false;
qemu_mutex_unlock(&p->mutex);