simplify main loop functions

Provide a clean example of how to use the main loop in the tools.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2011-09-12 14:03:13 +02:00
parent be08e65e01
commit 99435906cc
3 changed files with 41 additions and 44 deletions

5
cpus.c
View File

@ -626,11 +626,6 @@ void qemu_init_cpu_loop(void)
qemu_thread_get_self(&io_thread); qemu_thread_get_self(&io_thread);
} }
void qemu_main_loop_start(void)
{
resume_all_vcpus();
}
void run_on_cpu(CPUState *env, void (*func)(void *data), void *data) void run_on_cpu(CPUState *env, void (*func)(void *data), void *data)
{ {
struct qemu_work_item wi; struct qemu_work_item wi;

1
cpus.h
View File

@ -3,7 +3,6 @@
/* cpus.c */ /* cpus.c */
void qemu_init_cpu_loop(void); void qemu_init_cpu_loop(void);
void qemu_main_loop_start(void);
void resume_all_vcpus(void); void resume_all_vcpus(void);
void pause_all_vcpus(void); void pause_all_vcpus(void);
void cpu_stop_current(void); void cpu_stop_current(void);

79
vl.c
View File

@ -1428,18 +1428,49 @@ void qemu_system_vmstop_request(RunState state)
qemu_irq qemu_system_powerdown; qemu_irq qemu_system_powerdown;
static bool main_loop_should_exit(void)
{
RunState r;
if (qemu_debug_requested()) {
vm_stop(RUN_STATE_DEBUG);
}
if (qemu_shutdown_requested()) {
qemu_kill_report();
monitor_protocol_event(QEVENT_SHUTDOWN, NULL);
if (no_shutdown) {
vm_stop(RUN_STATE_SHUTDOWN);
} else {
return true;
}
}
if (qemu_reset_requested()) {
pause_all_vcpus();
cpu_synchronize_all_states();
qemu_system_reset(VMRESET_REPORT);
resume_all_vcpus();
if (runstate_check(RUN_STATE_INTERNAL_ERROR) ||
runstate_check(RUN_STATE_SHUTDOWN)) {
runstate_set(RUN_STATE_PAUSED);
}
}
if (qemu_powerdown_requested()) {
monitor_protocol_event(QEVENT_POWERDOWN, NULL);
qemu_irq_raise(qemu_system_powerdown);
}
if (qemu_vmstop_requested(&r)) {
vm_stop(r);
}
return false;
}
static void main_loop(void) static void main_loop(void)
{ {
bool nonblocking; bool nonblocking;
int last_io __attribute__ ((unused)) = 0; int last_io = 0;
#ifdef CONFIG_PROFILER #ifdef CONFIG_PROFILER
int64_t ti; int64_t ti;
#endif #endif
RunState r; do {
qemu_main_loop_start();
for (;;) {
nonblocking = !kvm_enabled() && last_io > 0; nonblocking = !kvm_enabled() && last_io > 0;
#ifdef CONFIG_PROFILER #ifdef CONFIG_PROFILER
ti = profile_getclock(); ti = profile_getclock();
@ -1448,38 +1479,7 @@ static void main_loop(void)
#ifdef CONFIG_PROFILER #ifdef CONFIG_PROFILER
dev_time += profile_getclock() - ti; dev_time += profile_getclock() - ti;
#endif #endif
} while (!main_loop_should_exit());
if (qemu_debug_requested()) {
vm_stop(RUN_STATE_DEBUG);
}
if (qemu_shutdown_requested()) {
qemu_kill_report();
monitor_protocol_event(QEVENT_SHUTDOWN, NULL);
if (no_shutdown) {
vm_stop(RUN_STATE_SHUTDOWN);
} else
break;
}
if (qemu_reset_requested()) {
pause_all_vcpus();
cpu_synchronize_all_states();
qemu_system_reset(VMRESET_REPORT);
resume_all_vcpus();
if (runstate_check(RUN_STATE_INTERNAL_ERROR) ||
runstate_check(RUN_STATE_SHUTDOWN)) {
runstate_set(RUN_STATE_PAUSED);
}
}
if (qemu_powerdown_requested()) {
monitor_protocol_event(QEVENT_POWERDOWN, NULL);
qemu_irq_raise(qemu_system_powerdown);
}
if (qemu_vmstop_requested(&r)) {
vm_stop(r);
}
}
bdrv_close_all();
pause_all_vcpus();
} }
static void version(void) static void version(void)
@ -3445,7 +3445,10 @@ int main(int argc, char **argv, char **envp)
os_setup_post(); os_setup_post();
resume_all_vcpus();
main_loop(); main_loop();
bdrv_close_all();
pause_all_vcpus();
net_cleanup(); net_cleanup();
res_free(); res_free();