Commit d82628e4 authored by Juan Quintela's avatar Juan Quintela
Browse files

migration: Multifd channels always wait on the sem



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

Signed-off-by: default avatarJuan Quintela <quintela@redhat.com>
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
parent 408ea6ae
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -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);