On 16 January 2015 at 17:19, <address@hidden> wrote:
From: KONRAD Frederic <address@hidden>
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