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);

49
vl.c
View File

@ -1428,27 +1428,9 @@ void qemu_system_vmstop_request(RunState state)
qemu_irq qemu_system_powerdown; qemu_irq qemu_system_powerdown;
static void main_loop(void) static bool main_loop_should_exit(void)
{ {
bool nonblocking;
int last_io __attribute__ ((unused)) = 0;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
RunState r; RunState r;
qemu_main_loop_start();
for (;;) {
nonblocking = !kvm_enabled() && last_io > 0;
#ifdef CONFIG_PROFILER
ti = profile_getclock();
#endif
last_io = main_loop_wait(nonblocking);
#ifdef CONFIG_PROFILER
dev_time += profile_getclock() - ti;
#endif
if (qemu_debug_requested()) { if (qemu_debug_requested()) {
vm_stop(RUN_STATE_DEBUG); vm_stop(RUN_STATE_DEBUG);
} }
@ -1457,8 +1439,9 @@ static void main_loop(void)
monitor_protocol_event(QEVENT_SHUTDOWN, NULL); monitor_protocol_event(QEVENT_SHUTDOWN, NULL);
if (no_shutdown) { if (no_shutdown) {
vm_stop(RUN_STATE_SHUTDOWN); vm_stop(RUN_STATE_SHUTDOWN);
} else } else {
break; return true;
}
} }
if (qemu_reset_requested()) { if (qemu_reset_requested()) {
pause_all_vcpus(); pause_all_vcpus();
@ -1477,9 +1460,26 @@ static void main_loop(void)
if (qemu_vmstop_requested(&r)) { if (qemu_vmstop_requested(&r)) {
vm_stop(r); vm_stop(r);
} }
return false;
} }
bdrv_close_all();
pause_all_vcpus(); static void main_loop(void)
{
bool nonblocking;
int last_io = 0;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
do {
nonblocking = !kvm_enabled() && last_io > 0;
#ifdef CONFIG_PROFILER
ti = profile_getclock();
#endif
last_io = main_loop_wait(nonblocking);
#ifdef CONFIG_PROFILER
dev_time += profile_getclock() - ti;
#endif
} while (!main_loop_should_exit());
} }
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();