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