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: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									cd34d667d4
								
							
						
					
					
						commit
						1ecf47bf0a
					
				| 
						 | 
				
			
			@ -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;        \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										11
									
								
								cpus.c
								
								
								
								
							
							
						
						
									
										11
									
								
								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);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,4 +19,7 @@ struct QemuThread {
 | 
			
		|||
    unsigned tid;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Only valid for joinable threads.  */
 | 
			
		||||
HANDLE qemu_thread_get_handle(QemuThread *thread);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue