Commit ed9164a3 authored by Olivier Hainque's avatar Olivier Hainque Committed by Stefan Weil
Browse files

Check effective suspension of TCG thread



On multi-core systems, SuspendThread does not guaranty immediate thread
suspension. We add busy loop to wait for effective thread suspension
after call to ThreadSuspend().

Signed-off-by: default avatarFabien Chouteau <chouteau@adacore.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarStefan Weil <sw@weilnetz.de>
parent 93b48c20
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -862,9 +862,29 @@ static void qemu_cpu_kick_thread(CPUState *cpu)
    }
#else /* _WIN32 */
    if (!qemu_cpu_is_self(cpu)) {
        SuspendThread(cpu->hThread);
        CONTEXT tcgContext;

        if (SuspendThread(cpu->hThread) == (DWORD)-1) {
            fprintf(stderr, "qemu:%s: GetLastError:%d\n", __func__,
                    GetLastError());
            exit(1);
        }

        /* On multi-core systems, we are not sure that the thread is actually
         * suspended until we can get the context.
         */
        tcgContext.ContextFlags = CONTEXT_CONTROL;
        while (GetThreadContext(cpu->hThread, &tcgContext) != 0) {
            continue;
        }

        cpu_signal(0);
        ResumeThread(cpu->hThread);

        if (ResumeThread(cpu->hThread) == (DWORD)-1) {
            fprintf(stderr, "qemu:%s: GetLastError:%d\n", __func__,
                    GetLastError());
            exit(1);
        }
    }
#endif
}