Revision cc015e9a cpus.c
b/cpus.c | ||
---|---|---|
854 | 854 |
return NULL; |
855 | 855 |
} |
856 | 856 |
|
857 |
static void qemu_cpu_kick_thread(CPUState *env) |
|
858 |
{ |
|
859 |
#ifndef _WIN32 |
|
860 |
int err; |
|
861 |
|
|
862 |
err = pthread_kill(env->thread->thread, SIG_IPI); |
|
863 |
if (err) { |
|
864 |
fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); |
|
865 |
exit(1); |
|
866 |
} |
|
867 |
#else /* _WIN32 */ |
|
868 |
if (!qemu_cpu_is_self(env)) { |
|
869 |
SuspendThread(env->thread->thread); |
|
870 |
cpu_signal(0); |
|
871 |
ResumeThread(env->thread->thread); |
|
872 |
} |
|
873 |
#endif |
|
874 |
} |
|
875 |
|
|
857 | 876 |
void qemu_cpu_kick(void *_env) |
858 | 877 |
{ |
859 | 878 |
CPUState *env = _env; |
860 | 879 |
|
861 | 880 |
qemu_cond_broadcast(env->halt_cond); |
862 | 881 |
if (!env->thread_kicked) { |
863 |
qemu_thread_signal(env->thread, SIG_IPI);
|
|
882 |
qemu_cpu_kick_thread(env);
|
|
864 | 883 |
env->thread_kicked = true; |
865 | 884 |
} |
866 | 885 |
} |
... | ... | |
871 | 890 |
assert(cpu_single_env); |
872 | 891 |
|
873 | 892 |
if (!cpu_single_env->thread_kicked) { |
874 |
qemu_thread_signal(cpu_single_env->thread, SIG_IPI);
|
|
893 |
qemu_cpu_kick_thread(cpu_single_env);
|
|
875 | 894 |
cpu_single_env->thread_kicked = true; |
876 | 895 |
} |
877 | 896 |
#else |
... | ... | |
893 | 912 |
} else { |
894 | 913 |
qemu_mutex_lock(&qemu_fair_mutex); |
895 | 914 |
if (qemu_mutex_trylock(&qemu_global_mutex)) { |
896 |
qemu_thread_signal(tcg_cpu_thread, SIG_IPI);
|
|
915 |
qemu_cpu_kick_thread(first_cpu);
|
|
897 | 916 |
qemu_mutex_lock(&qemu_global_mutex); |
898 | 917 |
} |
899 | 918 |
qemu_mutex_unlock(&qemu_fair_mutex); |
Also available in: Unified diff