diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2011-03-12 17:44:08 +0100 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2011-03-13 14:44:22 +0000 |
commit | cc015e9a5dde2f03f123357fa060acbdfcd570a4 (patch) | |
tree | 063cf9664992f48f1b7c0bb3ed4626f985715549 /cpus.c | |
parent | b55c22c65b630137a2374ce9f2cfbf71322b7b71 (diff) | |
download | qemu-cc015e9a5dde2f03f123357fa060acbdfcd570a4.zip qemu-cc015e9a5dde2f03f123357fa060acbdfcd570a4.tar.gz qemu-cc015e9a5dde2f03f123357fa060acbdfcd570a4.tar.bz2 |
add Win32 IPI service
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'cpus.c')
-rw-r--r-- | cpus.c | 25 |
1 files changed, 22 insertions, 3 deletions
@@ -854,13 +854,32 @@ static void *qemu_tcg_cpu_thread_fn(void *arg) return NULL; } +static void qemu_cpu_kick_thread(CPUState *env) +{ +#ifndef _WIN32 + int err; + + err = pthread_kill(env->thread->thread, SIG_IPI); + if (err) { + fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); + exit(1); + } +#else /* _WIN32 */ + if (!qemu_cpu_is_self(env)) { + SuspendThread(env->thread->thread); + cpu_signal(0); + ResumeThread(env->thread->thread); + } +#endif +} + void qemu_cpu_kick(void *_env) { CPUState *env = _env; qemu_cond_broadcast(env->halt_cond); if (!env->thread_kicked) { - qemu_thread_signal(env->thread, SIG_IPI); + qemu_cpu_kick_thread(env); env->thread_kicked = true; } } @@ -871,7 +890,7 @@ void qemu_cpu_kick_self(void) assert(cpu_single_env); if (!cpu_single_env->thread_kicked) { - qemu_thread_signal(cpu_single_env->thread, SIG_IPI); + qemu_cpu_kick_thread(cpu_single_env); cpu_single_env->thread_kicked = true; } #else @@ -893,7 +912,7 @@ void qemu_mutex_lock_iothread(void) } else { qemu_mutex_lock(&qemu_fair_mutex); if (qemu_mutex_trylock(&qemu_global_mutex)) { - qemu_thread_signal(tcg_cpu_thread, SIG_IPI); + qemu_cpu_kick_thread(first_cpu); qemu_mutex_lock(&qemu_global_mutex); } qemu_mutex_unlock(&qemu_fair_mutex); |