Revision d6f4ade2 vl.c
b/vl.c | ||
---|---|---|
618 | 618 |
}; |
619 | 619 |
|
620 | 620 |
static struct qemu_alarm_timer *alarm_timer; |
621 |
static int qemu_calculate_timeout(void); |
|
621 | 622 |
|
622 | 623 |
static inline int qemu_alarm_pending(void) |
623 | 624 |
{ |
... | ... | |
3596 | 3597 |
return NULL; |
3597 | 3598 |
} |
3598 | 3599 |
|
3599 |
static void tcg_cpu_exec(void);
|
|
3600 |
static bool tcg_cpu_exec(void);
|
|
3600 | 3601 |
|
3601 | 3602 |
static void *tcg_cpu_thread_fn(void *arg) |
3602 | 3603 |
{ |
... | ... | |
3914 | 3915 |
} |
3915 | 3916 |
#endif |
3916 | 3917 |
|
3917 |
void main_loop_wait(int timeout)
|
|
3918 |
void main_loop_wait(int nonblocking)
|
|
3918 | 3919 |
{ |
3919 | 3920 |
IOHandlerRecord *ioh; |
3920 | 3921 |
fd_set rfds, wfds, xfds; |
3921 | 3922 |
int ret, nfds; |
3922 | 3923 |
struct timeval tv; |
3924 |
int timeout; |
|
3923 | 3925 |
|
3924 |
qemu_bh_update_timeout(&timeout); |
|
3926 |
if (nonblocking) |
|
3927 |
timeout = 0; |
|
3928 |
else { |
|
3929 |
timeout = qemu_calculate_timeout(); |
|
3930 |
qemu_bh_update_timeout(&timeout); |
|
3931 |
} |
|
3925 | 3932 |
|
3926 | 3933 |
host_main_loop_wait(&timeout); |
3927 | 3934 |
|
... | ... | |
4028 | 4035 |
return ret; |
4029 | 4036 |
} |
4030 | 4037 |
|
4031 |
static void tcg_cpu_exec(void)
|
|
4038 |
static bool tcg_cpu_exec(void)
|
|
4032 | 4039 |
{ |
4033 | 4040 |
int ret = 0; |
4034 | 4041 |
|
... | ... | |
4053 | 4060 |
break; |
4054 | 4061 |
} |
4055 | 4062 |
} |
4063 |
return tcg_has_work(); |
|
4056 | 4064 |
} |
4057 | 4065 |
|
4058 | 4066 |
static int qemu_calculate_timeout(void) |
... | ... | |
4062 | 4070 |
|
4063 | 4071 |
if (!vm_running) |
4064 | 4072 |
timeout = 5000; |
4065 |
else if (tcg_has_work()) |
|
4066 |
timeout = 0; |
|
4067 | 4073 |
else { |
4068 | 4074 |
/* XXX: use timeout computed from timers */ |
4069 | 4075 |
int64_t add; |
... | ... | |
4123 | 4129 |
|
4124 | 4130 |
for (;;) { |
4125 | 4131 |
do { |
4132 |
bool nonblocking = false; |
|
4126 | 4133 |
#ifdef CONFIG_PROFILER |
4127 | 4134 |
int64_t ti; |
4128 | 4135 |
#endif |
4129 | 4136 |
#ifndef CONFIG_IOTHREAD |
4130 |
tcg_cpu_exec(); |
|
4137 |
nonblocking = tcg_cpu_exec();
|
|
4131 | 4138 |
#endif |
4132 | 4139 |
#ifdef CONFIG_PROFILER |
4133 | 4140 |
ti = profile_getclock(); |
4134 | 4141 |
#endif |
4135 |
main_loop_wait(qemu_calculate_timeout());
|
|
4142 |
main_loop_wait(nonblocking);
|
|
4136 | 4143 |
#ifdef CONFIG_PROFILER |
4137 | 4144 |
dev_time += profile_getclock() - ti; |
4138 | 4145 |
#endif |
Also available in: Unified diff