On 16 January 2015 at 17:19, <fred.kon...@greensocs.com> wrote: > From: KONRAD Frederic <fred.kon...@greensocs.com> > > This removes exit_request global and adds a variable in CPUState for this. > Only the flag for the first cpu is used for the moment as we are still with > one > TCG thread.
> --- a/cpus.c > +++ b/cpus.c > @@ -646,10 +646,14 @@ static void cpu_handle_guest_debug(CPUState *cpu) > > static void cpu_signal(int sig) > { > + CPUState *cpu; > if (current_cpu) { > cpu_exit(current_cpu); > } > - exit_request = 1; > + > + CPU_FOREACH(cpu) { > + cpu->exit_loop_request = 1; > + } > } You can't do this -- this code is a signal handler so it could get run at any time including while the list of CPUs is being updated. (This is why we have the exit_request flag in the first place rather than just setting the exit_request flag in each CPU...) Possibly you want exit_request to be a per-thread variable, but I haven't thought much about it. > --- a/include/qom/cpu.h > +++ b/include/qom/cpu.h > @@ -249,6 +249,7 @@ struct CPUState { > bool created; > bool stop; > bool stopped; > + volatile sig_atomic_t exit_loop_request; > volatile sig_atomic_t exit_request; > uint32_t interrupt_request; > int singlestep_enabled; This would duplicate the exit_request and exit_loop_request flags in the CPU, which is kind of odd. -- PMM