|
@@ -317,22 +317,22 @@ void rr_start_vcpu_thread(CPUState *cpu)
|
|
|
tcg_cpu_init_cflags(cpu, false);
|
|
|
|
|
|
if (!single_tcg_cpu_thread) {
|
|
|
- cpu->thread = g_new0(QemuThread, 1);
|
|
|
- cpu->halt_cond = g_new0(QemuCond, 1);
|
|
|
- qemu_cond_init(cpu->halt_cond);
|
|
|
+ single_tcg_halt_cond = cpu->halt_cond;
|
|
|
+ single_tcg_cpu_thread = cpu->thread;
|
|
|
|
|
|
/* share a single thread for all cpus with TCG */
|
|
|
snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
|
|
|
qemu_thread_create(cpu->thread, thread_name,
|
|
|
rr_cpu_thread_fn,
|
|
|
cpu, QEMU_THREAD_JOINABLE);
|
|
|
-
|
|
|
- single_tcg_halt_cond = cpu->halt_cond;
|
|
|
- single_tcg_cpu_thread = cpu->thread;
|
|
|
} else {
|
|
|
- /* we share the thread */
|
|
|
+ /* we share the thread, dump spare data */
|
|
|
+ g_free(cpu->thread);
|
|
|
+ qemu_cond_destroy(cpu->halt_cond);
|
|
|
cpu->thread = single_tcg_cpu_thread;
|
|
|
cpu->halt_cond = single_tcg_halt_cond;
|
|
|
+
|
|
|
+ /* copy the stuff done at start of rr_cpu_thread_fn */
|
|
|
cpu->thread_id = first_cpu->thread_id;
|
|
|
cpu->neg.can_do_io = 1;
|
|
|
cpu->created = true;
|