Revision c96f1a48
b/vl.c | ||
---|---|---|
885 | 885 |
#define MIN_TIMER_REARM_US 250 |
886 | 886 |
|
887 | 887 |
static struct qemu_alarm_timer *alarm_timer; |
888 |
static int alarm_timer_rfd, alarm_timer_wfd; |
|
888 | 889 |
|
889 | 890 |
#ifdef _WIN32 |
890 | 891 |
|
... | ... | |
1304 | 1305 |
qemu_get_clock(vm_clock))) || |
1305 | 1306 |
qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME], |
1306 | 1307 |
qemu_get_clock(rt_clock))) { |
1308 |
CPUState *env = next_cpu; |
|
1309 |
static const char byte = 0; |
|
1310 |
|
|
1307 | 1311 |
#ifdef _WIN32 |
1308 | 1312 |
struct qemu_alarm_win32 *data = ((struct qemu_alarm_timer*)dwUser)->priv; |
1309 | 1313 |
SetEvent(data->host_alarm); |
1310 | 1314 |
#endif |
1311 |
CPUState *env = next_cpu; |
|
1312 | 1315 |
|
1316 |
write(alarm_timer_wfd, &byte, sizeof(byte)); |
|
1313 | 1317 |
alarm_timer->flags |= ALARM_FLAG_EXPIRED; |
1314 | 1318 |
|
1315 | 1319 |
if (env) { |
... | ... | |
1674 | 1678 |
{ |
1675 | 1679 |
struct qemu_alarm_timer *t = NULL; |
1676 | 1680 |
int i, err = -1; |
1681 |
int fds[2]; |
|
1682 |
|
|
1683 |
if (pipe(fds) < 0) { |
|
1684 |
fail: |
|
1685 |
perror("creating timer pipe"); |
|
1686 |
exit(1); |
|
1687 |
} |
|
1688 |
for (i = 0; i < 2; i++) { |
|
1689 |
int flags = fcntl(fds[i], F_GETFL); |
|
1690 |
if (flags == -1 || fcntl(fds[i], F_SETFL, flags | O_NONBLOCK)) |
|
1691 |
goto fail; |
|
1692 |
} |
|
1693 |
alarm_timer_rfd = fds[0]; |
|
1694 |
alarm_timer_wfd = fds[1]; |
|
1677 | 1695 |
|
1678 | 1696 |
for (i = 0; alarm_timers[i].name; i++) { |
1679 | 1697 |
t = &alarm_timers[i]; |
... | ... | |
4426 | 4444 |
|
4427 | 4445 |
/* poll any events */ |
4428 | 4446 |
/* XXX: separate device handlers from system ones */ |
4429 |
nfds = -1;
|
|
4447 |
nfds = alarm_timer_rfd;
|
|
4430 | 4448 |
FD_ZERO(&rfds); |
4449 |
FD_SET(alarm_timer_rfd, &rfds); |
|
4431 | 4450 |
FD_ZERO(&wfds); |
4432 | 4451 |
FD_ZERO(&xfds); |
4433 | 4452 |
for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) { |
... | ... | |
4501 | 4520 |
qemu_get_clock(rt_clock)); |
4502 | 4521 |
|
4503 | 4522 |
if (alarm_timer->flags & ALARM_FLAG_EXPIRED) { |
4523 |
char byte; |
|
4524 |
do { |
|
4525 |
ret = read(alarm_timer_rfd, &byte, sizeof(byte)); |
|
4526 |
} while (ret != -1 || errno != EAGAIN); |
|
4527 |
|
|
4504 | 4528 |
alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED); |
4505 | 4529 |
qemu_rearm_alarm_timer(alarm_timer); |
4506 | 4530 |
} |
Also available in: Unified diff