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