diff options
author | Stefan Weil <sw@weilnetz.de> | 2012-01-31 07:14:15 +0100 |
---|---|---|
committer | Stefan Weil <sw@weilnetz.de> | 2012-02-07 18:11:41 +0100 |
commit | edc1de97138af028bba216ef71d1d995834829df (patch) | |
tree | 98cd961a8f9b61b3f43a39bb3d9cbf5c29e39b8d /qemu-thread-win32.c | |
parent | 0fa5491eed8ff4fe63cb63c93ce37ff76de7c010 (diff) |
w32: Initialise critical section before starting thread (fix #922131)
This patch was contributed by Bogdan Harjoc. I added some assertions.
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
Diffstat (limited to 'qemu-thread-win32.c')
-rw-r--r-- | qemu-thread-win32.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/qemu-thread-win32.c b/qemu-thread-win32.c index fe9b931863..3524c8b785 100644 --- a/qemu-thread-win32.c +++ b/qemu-thread-win32.c @@ -215,8 +215,6 @@ static unsigned __stdcall win32_start_routine(void *arg) if (data->mode == QEMU_THREAD_DETACHED) { g_free(data); data = NULL; - } else { - InitializeCriticalSection(&data->cs); } TlsSetValue(qemu_thread_tls_index, data); qemu_thread_exit(start_routine(thread_arg)); @@ -227,6 +225,7 @@ void qemu_thread_exit(void *arg) { QemuThreadData *data = TlsGetValue(qemu_thread_tls_index); if (data) { + assert(data->mode != QEMU_THREAD_DETACHED); data->ret = arg; EnterCriticalSection(&data->cs); data->exited = true; @@ -258,6 +257,7 @@ void *qemu_thread_join(QemuThread *thread) CloseHandle(handle); } ret = data->ret; + assert(data->mode != QEMU_THREAD_DETACHED); DeleteCriticalSection(&data->cs); g_free(data); return ret; @@ -288,6 +288,10 @@ void qemu_thread_create(QemuThread *thread, data->mode = mode; data->exited = false; + if (data->mode != QEMU_THREAD_DETACHED) { + InitializeCriticalSection(&data->cs); + } + hThread = (HANDLE) _beginthreadex(NULL, 0, win32_start_routine, data, 0, &thread->tid); if (!hThread) { @@ -314,6 +318,7 @@ HANDLE qemu_thread_get_handle(QemuThread *thread) return NULL; } + assert(data->mode != QEMU_THREAD_DETACHED); EnterCriticalSection(&data->cs); if (!data->exited) { handle = OpenThread(SYNCHRONIZE | THREAD_SUSPEND_RESUME, FALSE, |