From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: blauwirbel@gmail.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] fix win32 build
Date: Thu, 15 Dec 2011 12:11:16 -0600 [thread overview]
Message-ID: <4EEA3844.2030507@codemonkey.ws> (raw)
In-Reply-To: <1323780232-4446-1-git-send-email-pbonzini@redhat.com>
On 12/13/2011 06:43 AM, Paolo Bonzini wrote:
> On Windows, cpus.c needs access to the hThread. Add a Windows-specific
> function to grab it. This requires changing the CPU threads to
> joinable. There is no substantial change because the threads run
> in an infinite loop.
>
> Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
Applied. Thanks.
Regards,
Anthony Liguori
> ---
> cpu-defs.h | 9 +++++++++
> cpus.c | 11 +++++++----
> qemu-thread-win32.c | 29 +++++++++++++++++++++++------
> qemu-thread-win32.h | 3 +++
> 4 files changed, 42 insertions(+), 10 deletions(-)
>
> diff --git a/cpu-defs.h b/cpu-defs.h
> index db48a7a..57a709b 100644
> --- a/cpu-defs.h
> +++ b/cpu-defs.h
> @@ -153,6 +153,14 @@ typedef struct CPUWatchpoint {
> QTAILQ_ENTRY(CPUWatchpoint) entry;
> } CPUWatchpoint;
>
> +#ifdef _WIN32
> +#define CPU_COMMON_THREAD \
> + void *hThread;
> +
> +#else
> +#define CPU_COMMON_THREAD
> +#endif
> +
> #define CPU_TEMP_BUF_NLONGS 128
> #define CPU_COMMON \
> struct TranslationBlock *current_tb; /* currently executing TB */ \
> @@ -211,6 +219,7 @@ typedef struct CPUWatchpoint {
> uint32_t stop; /* Stop request */ \
> uint32_t stopped; /* Artificially stopped */ \
> struct QemuThread *thread; \
> + CPU_COMMON_THREAD \
> struct QemuCond *halt_cond; \
> int thread_kicked; \
> struct qemu_work_item *queued_work_first, *queued_work_last; \
> diff --git a/cpus.c b/cpus.c
> index 1ada0f5..11893d5 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -793,9 +793,9 @@ static void qemu_cpu_kick_thread(CPUState *env)
> }
> #else /* _WIN32 */
> if (!qemu_cpu_is_self(env)) {
> - SuspendThread(env->thread->thread);
> + SuspendThread(env->hThread);
> cpu_signal(0);
> - ResumeThread(env->thread->thread);
> + ResumeThread(env->hThread);
> }
> #endif
> }
> @@ -911,7 +911,10 @@ static void qemu_tcg_init_vcpu(void *_env)
> qemu_cond_init(env->halt_cond);
> tcg_halt_cond = env->halt_cond;
> qemu_thread_create(env->thread, qemu_tcg_cpu_thread_fn, env,
> - QEMU_THREAD_DETACHED);
> + QEMU_THREAD_JOINABLE);
> +#ifdef _WIN32
> + env->hThread = qemu_thread_get_handle(env->thread);
> +#endif
> while (env->created == 0) {
> qemu_cond_wait(&qemu_cpu_cond,&qemu_global_mutex);
> }
> @@ -928,7 +931,7 @@ static void qemu_kvm_start_vcpu(CPUState *env)
> env->halt_cond = g_malloc0(sizeof(QemuCond));
> qemu_cond_init(env->halt_cond);
> qemu_thread_create(env->thread, qemu_kvm_cpu_thread_fn, env,
> - QEMU_THREAD_DETACHED);
> + QEMU_THREAD_JOINABLE);
> while (env->created == 0) {
> qemu_cond_wait(&qemu_cpu_cond,&qemu_global_mutex);
> }
> diff --git a/qemu-thread-win32.c b/qemu-thread-win32.c
> index a13ffcc..fe9b931 100644
> --- a/qemu-thread-win32.c
> +++ b/qemu-thread-win32.c
> @@ -252,14 +252,10 @@ void *qemu_thread_join(QemuThread *thread)
> * discard the handle that _beginthreadex gives back, and
> * get another copy of the handle here.
> */
> - EnterCriticalSection(&data->cs);
> - if (!data->exited) {
> - handle = OpenThread(SYNCHRONIZE, FALSE, thread->tid);
> - LeaveCriticalSection(&data->cs);
> + handle = qemu_thread_get_handle(thread);
> + if (handle) {
> WaitForSingleObject(handle, INFINITE);
> CloseHandle(handle);
> - } else {
> - LeaveCriticalSection(&data->cs);
> }
> ret = data->ret;
> DeleteCriticalSection(&data->cs);
> @@ -308,6 +304,27 @@ void qemu_thread_get_self(QemuThread *thread)
> thread->tid = GetCurrentThreadId();
> }
>
> +HANDLE qemu_thread_get_handle(QemuThread *thread)
> +{
> + QemuThreadData *data;
> + HANDLE handle;
> +
> + data = thread->data;
> + if (!data) {
> + return NULL;
> + }
> +
> + EnterCriticalSection(&data->cs);
> + if (!data->exited) {
> + handle = OpenThread(SYNCHRONIZE | THREAD_SUSPEND_RESUME, FALSE,
> + thread->tid);
> + } else {
> + handle = NULL;
> + }
> + LeaveCriticalSection(&data->cs);
> + return handle;
> +}
> +
> int qemu_thread_is_self(QemuThread *thread)
> {
> return GetCurrentThreadId() == thread->tid;
> diff --git a/qemu-thread-win32.h b/qemu-thread-win32.h
> index 2983490..b9d1be8 100644
> --- a/qemu-thread-win32.h
> +++ b/qemu-thread-win32.h
> @@ -19,4 +19,7 @@ struct QemuThread {
> unsigned tid;
> };
>
> +/* Only valid for joinable threads. */
> +HANDLE qemu_thread_get_handle(QemuThread *thread);
> +
> #endif
prev parent reply other threads:[~2011-12-15 18:11 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-13 12:43 [Qemu-devel] [PATCH] fix win32 build Paolo Bonzini
2011-12-15 18:11 ` Anthony Liguori [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EEA3844.2030507@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=blauwirbel@gmail.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.