@@ -753,7 +753,7 @@ static void tcg_exec_all(void);
static void *qemu_tcg_cpu_thread_fn(void *arg)
{
CPUState *env = arg;
-
+ CPUState *prev = NULL;
qemu_tcg_init_cpu_signals();
qemu_thread_get_self(env->thread);
@@ -775,10 +775,29 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
if (use_icount && qemu_clock_deadline(vm_clock) <= 0) {
qemu_notify_event();
}
+ /*1,try to zap; 2, can safe to destroy*/
+ if (env->state == CPU_STATE_ZAPPED) {
+ goto zapout;
+ }
qemu_tcg_wait_io_event();
}
return NULL;
+zapout:
+ prev = first_cpu;
+ if (prev == env) {
+ first_cpu = env->next_cpu;
+ } else {
+ while (prev != NULL) {
+ if (prev->next_cpu == env) {
+ break;
+ }
+ prev = prev->next_cpu;
+ }
+ prev->next_cpu = env->next_cpu;
+ }
+ cpu_free(env);
+ return NULL;
}
static void qemu_cpu_kick_thread(CPUState *env)