提交 1ecf47bf 编写于 作者: P Paolo Bonzini 提交者: Anthony Liguori

fix win32 build

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: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 cd34d667
...@@ -153,6 +153,14 @@ typedef struct CPUWatchpoint { ...@@ -153,6 +153,14 @@ typedef struct CPUWatchpoint {
QTAILQ_ENTRY(CPUWatchpoint) entry; QTAILQ_ENTRY(CPUWatchpoint) entry;
} CPUWatchpoint; } CPUWatchpoint;
#ifdef _WIN32
#define CPU_COMMON_THREAD \
void *hThread;
#else
#define CPU_COMMON_THREAD
#endif
#define CPU_TEMP_BUF_NLONGS 128 #define CPU_TEMP_BUF_NLONGS 128
#define CPU_COMMON \ #define CPU_COMMON \
struct TranslationBlock *current_tb; /* currently executing TB */ \ struct TranslationBlock *current_tb; /* currently executing TB */ \
...@@ -211,6 +219,7 @@ typedef struct CPUWatchpoint { ...@@ -211,6 +219,7 @@ typedef struct CPUWatchpoint {
uint32_t stop; /* Stop request */ \ uint32_t stop; /* Stop request */ \
uint32_t stopped; /* Artificially stopped */ \ uint32_t stopped; /* Artificially stopped */ \
struct QemuThread *thread; \ struct QemuThread *thread; \
CPU_COMMON_THREAD \
struct QemuCond *halt_cond; \ struct QemuCond *halt_cond; \
int thread_kicked; \ int thread_kicked; \
struct qemu_work_item *queued_work_first, *queued_work_last; \ struct qemu_work_item *queued_work_first, *queued_work_last; \
......
...@@ -793,9 +793,9 @@ static void qemu_cpu_kick_thread(CPUState *env) ...@@ -793,9 +793,9 @@ static void qemu_cpu_kick_thread(CPUState *env)
} }
#else /* _WIN32 */ #else /* _WIN32 */
if (!qemu_cpu_is_self(env)) { if (!qemu_cpu_is_self(env)) {
SuspendThread(env->thread->thread); SuspendThread(env->hThread);
cpu_signal(0); cpu_signal(0);
ResumeThread(env->thread->thread); ResumeThread(env->hThread);
} }
#endif #endif
} }
...@@ -911,7 +911,10 @@ static void qemu_tcg_init_vcpu(void *_env) ...@@ -911,7 +911,10 @@ static void qemu_tcg_init_vcpu(void *_env)
qemu_cond_init(env->halt_cond); qemu_cond_init(env->halt_cond);
tcg_halt_cond = env->halt_cond; tcg_halt_cond = env->halt_cond;
qemu_thread_create(env->thread, qemu_tcg_cpu_thread_fn, env, 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) { while (env->created == 0) {
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
} }
...@@ -928,7 +931,7 @@ static void qemu_kvm_start_vcpu(CPUState *env) ...@@ -928,7 +931,7 @@ static void qemu_kvm_start_vcpu(CPUState *env)
env->halt_cond = g_malloc0(sizeof(QemuCond)); env->halt_cond = g_malloc0(sizeof(QemuCond));
qemu_cond_init(env->halt_cond); qemu_cond_init(env->halt_cond);
qemu_thread_create(env->thread, qemu_kvm_cpu_thread_fn, env, qemu_thread_create(env->thread, qemu_kvm_cpu_thread_fn, env,
QEMU_THREAD_DETACHED); QEMU_THREAD_JOINABLE);
while (env->created == 0) { while (env->created == 0) {
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
} }
......
...@@ -252,14 +252,10 @@ void *qemu_thread_join(QemuThread *thread) ...@@ -252,14 +252,10 @@ void *qemu_thread_join(QemuThread *thread)
* discard the handle that _beginthreadex gives back, and * discard the handle that _beginthreadex gives back, and
* get another copy of the handle here. * get another copy of the handle here.
*/ */
EnterCriticalSection(&data->cs); handle = qemu_thread_get_handle(thread);
if (!data->exited) { if (handle) {
handle = OpenThread(SYNCHRONIZE, FALSE, thread->tid);
LeaveCriticalSection(&data->cs);
WaitForSingleObject(handle, INFINITE); WaitForSingleObject(handle, INFINITE);
CloseHandle(handle); CloseHandle(handle);
} else {
LeaveCriticalSection(&data->cs);
} }
ret = data->ret; ret = data->ret;
DeleteCriticalSection(&data->cs); DeleteCriticalSection(&data->cs);
...@@ -308,6 +304,27 @@ void qemu_thread_get_self(QemuThread *thread) ...@@ -308,6 +304,27 @@ void qemu_thread_get_self(QemuThread *thread)
thread->tid = GetCurrentThreadId(); 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) int qemu_thread_is_self(QemuThread *thread)
{ {
return GetCurrentThreadId() == thread->tid; return GetCurrentThreadId() == thread->tid;
......
...@@ -19,4 +19,7 @@ struct QemuThread { ...@@ -19,4 +19,7 @@ struct QemuThread {
unsigned tid; unsigned tid;
}; };
/* Only valid for joinable threads. */
HANDLE qemu_thread_get_handle(QemuThread *thread);
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册