Esempio n. 1
0
File: timeval.c Progetto: ecks/harry
/* Like poll(), except:
 *
 *      - On error, returns a negative error code (instead of setting errno).
 *
 *      - If interrupted by a signal, retries automatically until the original
 *        'timeout' expires.  (Because of this property, this function will
 *        never return -EINTR.)
 *
 *      - As a side effect, refreshes the current time (like time_refresh()).
 */
int
time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when, int * elapsed)
{
  long long int start;
  sigset_t oldsigs;
  bool blocked;
  int retval;

  time_refresh();
  start = time_msec();
  blocked = false;
  for (;;) {
      long long int now = time_msec();
      int time_left;

      if (now >= timeout_when) {
          time_left = 0;
          printf("time_left: 0\n");
      } else if ((unsigned long long int) timeout_when - now > INT_MAX) {
          time_left = INT_MAX;
          printf("time_left: INT_MAX\n");
      } else {
          time_left = timeout_when - now;
          printf("time_left: %d\n", time_left);
      }

      retval = poll(pollfds, n_pollfds, time_left);
      printf("time_poll -> return from poll: %d\n", retval);
      if (retval < 0) {
          retval = -errno;
          perror("time_poll");
      }
      if (retval != -EINTR) {
          break;
      }

      if (!blocked && deadline == TIME_MIN) {
//          block_sigalrm(&oldsigs);
          blocked = true;
      }
      time_refresh();
  }
  if (blocked) {
//      unblock_sigalrm(&oldsigs);
  }
  return retval;
}
Esempio n. 2
0
File: timeval.c Progetto: ecks/harry
static void
refresh_if_ticked(void)
{
    assert(inited);
    if (tick) {
        time_refresh();
    }
}
Esempio n. 3
0
/* Like poll(), except:
 *
 *      - On error, returns a negative error code (instead of setting errno).
 *
 *      - If interrupted by a signal, retries automatically until the original
 *        'timeout' expires.  (Because of this property, this function will
 *        never return -EINTR.)
 *
 *      - As a side effect, refreshes the current time (like time_refresh()).
 */
int
time_poll(struct pollfd *pollfds, int n_pollfds, int timeout)
{
    long long int start;
    sigset_t oldsigs;
    bool blocked;
    int retval;

    time_refresh();
    start = time_msec();
    blocked = false;
    for (;;) {
        int time_left;
        if (timeout > 0) {
            long long int elapsed = time_msec() - start;
            time_left = timeout >= elapsed ? timeout - elapsed : 0;
        } else {
            time_left = timeout;
        }

        retval = poll(pollfds, n_pollfds, time_left);
        if (retval < 0) {
            retval = -errno;
        }
        if (retval != -EINTR) {
            break;
        }

        if (!blocked && deadline == TIME_MIN) {
            block_sigalrm(&oldsigs);
            blocked = true;
        }
        time_refresh();
    }
    if (blocked) {
        unblock_sigalrm(&oldsigs);
    }
    return retval;
}