Commit 7183b4b47a008577f9488bc236d67480a9079cdc

Authored by aliguori
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
... ... @@ -1374,6 +1374,21 @@ static uint64_t qemu_next_deadline_dyntick(void)
1374 1374  
1375 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 1392 #if defined(__linux__)
1378 1393  
1379 1394 #define RTC_FREQ 1024
... ... @@ -1388,7 +1403,7 @@ static void enable_sigio_timer(int fd)
1388 1403 act.sa_handler = host_alarm_handler;
1389 1404  
1390 1405 sigaction(SIGIO, &act, NULL);
1391   - fcntl(fd, F_SETFL, O_ASYNC);
  1406 + fcntl_setfl(fd, O_ASYNC);
1392 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 1689  
1675 1690 #endif /* _WIN32 */
1676 1691  
1677   -static void init_timer_alarm(void)
  1692 +static int init_timer_alarm(void)
1678 1693 {
1679 1694 struct qemu_alarm_timer *t = NULL;
1680 1695 int i, err = -1;
1681 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 1710 alarm_timer_rfd = fds[0];
1694 1711 alarm_timer_wfd = fds[1];
1695 1712  
... ... @@ -1702,12 +1719,18 @@ static void init_timer_alarm(void)
1702 1719 }
1703 1720  
1704 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 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 1736 static void quit_timers(void)
... ... @@ -6075,7 +6098,10 @@ int main(int argc, char **argv)
6075 6098 setvbuf(stdout, NULL, _IOLBF, 0);
6076 6099  
6077 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 6105 if (use_icount && icount_time_shift < 0) {
6080 6106 use_icount = 2;
6081 6107 /* 125MIPS seems a reasonable initial guess at the guest speed.
... ...