int qemu_init_main_loop(void) { int ret; sigset_t blocked_signals; cpu_set_debug_excp_handler(cpu_debug_handler); blocked_signals = block_io_signals(); ret = qemu_signalfd_init(blocked_signals); if (ret) return ret; /* Note eventfd must be drained before signalfd handlers run */ ret = qemu_event_init(); if (ret) return ret; qemu_cond_init(&qemu_pause_cond); qemu_cond_init(&qemu_system_cond); qemu_mutex_init(&qemu_fair_mutex); qemu_mutex_init(&qemu_global_mutex); qemu_mutex_lock(&qemu_global_mutex); qemu_thread_self(&io_thread); return 0; }
static void *tcg_cpu_thread_fn(void *arg) { CPUState *env = arg; block_io_signals(); qemu_thread_self(env->thread); /* signal CPU creation */ qemu_mutex_lock(&qemu_global_mutex); for (env = first_cpu; env != NULL; env = env->next_cpu) env->created = 1; qemu_cond_signal(&qemu_cpu_cond); /* and wait for machine initialization */ while (!qemu_system_ready) qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100); while (1) { tcg_cpu_exec(); qemu_wait_io_event(cur_cpu); } return NULL; }
static void *kvm_cpu_thread_fn(void *arg) { CPUState *env = arg; block_io_signals(); qemu_thread_self(env->thread); /* signal CPU creation */ qemu_mutex_lock(&qemu_global_mutex); env->created = 1; qemu_cond_signal(&qemu_cpu_cond); /* and wait for machine initialization */ while (!qemu_system_ready) qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100); while (1) { if (cpu_can_run(env)) qemu_cpu_exec(env); qemu_wait_io_event(env); } return NULL; }