Commit 7183b4b47a008577f9488bc236d67480a9079cdc
1 parent
c96f1a48
Improve error reporting in init_timer_alarm
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5634 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
42 additions
and
16 deletions
vl.c
@@ -1374,6 +1374,21 @@ static uint64_t qemu_next_deadline_dyntick(void) | @@ -1374,6 +1374,21 @@ static uint64_t qemu_next_deadline_dyntick(void) | ||
1374 | 1374 | ||
1375 | #ifndef _WIN32 | 1375 | #ifndef _WIN32 |
1376 | 1376 | ||
1377 | +/* Sets a specific flag */ | ||
1378 | +static int fcntl_setfl(int fd, int flag) | ||
1379 | +{ | ||
1380 | + int flags; | ||
1381 | + | ||
1382 | + flags = fcntl(fd, F_GETFL); | ||
1383 | + if (flags == -1) | ||
1384 | + return -errno; | ||
1385 | + | ||
1386 | + if (fcntl(fd, F_SETFL, flags | flag) == -1) | ||
1387 | + return -errno; | ||
1388 | + | ||
1389 | + return 0; | ||
1390 | +} | ||
1391 | + | ||
1377 | #if defined(__linux__) | 1392 | #if defined(__linux__) |
1378 | 1393 | ||
1379 | #define RTC_FREQ 1024 | 1394 | #define RTC_FREQ 1024 |
@@ -1388,7 +1403,7 @@ static void enable_sigio_timer(int fd) | @@ -1388,7 +1403,7 @@ static void enable_sigio_timer(int fd) | ||
1388 | act.sa_handler = host_alarm_handler; | 1403 | act.sa_handler = host_alarm_handler; |
1389 | 1404 | ||
1390 | sigaction(SIGIO, &act, NULL); | 1405 | sigaction(SIGIO, &act, NULL); |
1391 | - fcntl(fd, F_SETFL, O_ASYNC); | 1406 | + fcntl_setfl(fd, O_ASYNC); |
1392 | fcntl(fd, F_SETOWN, getpid()); | 1407 | fcntl(fd, F_SETOWN, getpid()); |
1393 | } | 1408 | } |
1394 | 1409 | ||
@@ -1674,22 +1689,24 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t) | @@ -1674,22 +1689,24 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t) | ||
1674 | 1689 | ||
1675 | #endif /* _WIN32 */ | 1690 | #endif /* _WIN32 */ |
1676 | 1691 | ||
1677 | -static void init_timer_alarm(void) | 1692 | +static int init_timer_alarm(void) |
1678 | { | 1693 | { |
1679 | struct qemu_alarm_timer *t = NULL; | 1694 | struct qemu_alarm_timer *t = NULL; |
1680 | int i, err = -1; | 1695 | int i, err = -1; |
1681 | int fds[2]; | 1696 | int fds[2]; |
1682 | 1697 | ||
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 | - } | 1698 | + err = pipe(fds); |
1699 | + if (err == -1) | ||
1700 | + return -errno; | ||
1701 | + | ||
1702 | + err = fcntl_setfl(fds[0], O_NONBLOCK); | ||
1703 | + if (err < 0) | ||
1704 | + goto fail; | ||
1705 | + | ||
1706 | + err = fcntl_setfl(fds[1], O_NONBLOCK); | ||
1707 | + if (err < 0) | ||
1708 | + goto fail; | ||
1709 | + | ||
1693 | alarm_timer_rfd = fds[0]; | 1710 | alarm_timer_rfd = fds[0]; |
1694 | alarm_timer_wfd = fds[1]; | 1711 | alarm_timer_wfd = fds[1]; |
1695 | 1712 | ||
@@ -1702,12 +1719,18 @@ static void init_timer_alarm(void) | @@ -1702,12 +1719,18 @@ static void init_timer_alarm(void) | ||
1702 | } | 1719 | } |
1703 | 1720 | ||
1704 | if (err) { | 1721 | if (err) { |
1705 | - fprintf(stderr, "Unable to find any suitable alarm timer.\n"); | ||
1706 | - fprintf(stderr, "Terminating\n"); | ||
1707 | - exit(1); | 1722 | + err = -ENOENT; |
1723 | + goto fail; | ||
1708 | } | 1724 | } |
1709 | 1725 | ||
1710 | alarm_timer = t; | 1726 | alarm_timer = t; |
1727 | + | ||
1728 | + return 1; | ||
1729 | + | ||
1730 | +fail: | ||
1731 | + close(fds[0]); | ||
1732 | + close(fds[1]); | ||
1733 | + return err; | ||
1711 | } | 1734 | } |
1712 | 1735 | ||
1713 | static void quit_timers(void) | 1736 | static void quit_timers(void) |
@@ -6075,7 +6098,10 @@ int main(int argc, char **argv) | @@ -6075,7 +6098,10 @@ int main(int argc, char **argv) | ||
6075 | setvbuf(stdout, NULL, _IOLBF, 0); | 6098 | setvbuf(stdout, NULL, _IOLBF, 0); |
6076 | 6099 | ||
6077 | init_timers(); | 6100 | init_timers(); |
6078 | - init_timer_alarm(); | 6101 | + if (init_timer_alarm() < 0) { |
6102 | + fprintf(stderr, "could not initialize alarm timer\n"); | ||
6103 | + exit(1); | ||
6104 | + } | ||
6079 | if (use_icount && icount_time_shift < 0) { | 6105 | if (use_icount && icount_time_shift < 0) { |
6080 | use_icount = 2; | 6106 | use_icount = 2; |
6081 | /* 125MIPS seems a reasonable initial guess at the guest speed. | 6107 | /* 125MIPS seems a reasonable initial guess at the guest speed. |