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:
parent
be08e65e01
commit
99435906cc
5
cpus.c
5
cpus.c
@ -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
1
cpus.h
@ -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
79
vl.c
@ -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();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user