static void sleeptill(struct timeval sched) { int sts; struct timeval curr; /* current time */ struct timespec delay; /* interval to sleep */ struct timespec left; /* remaining sleep time */ __pmtimevalNow(&curr); tospec(tsub(sched, curr), &delay); for (;;) { /* loop to catch early wakeup by nanosleep */ sts = nanosleep(&delay, &left); if (sts == 0 || (sts < 0 && errno != EINTR)) break; delay = left; } }
/* sleep until given timeval */ void __pmtimevalPause(struct timeval sched) { int sts; struct timeval curr; /* current time */ struct timespec delay; /* interval to sleep */ struct timespec left; /* remaining sleep time */ __pmtimevalNow(&curr); __pmtimevalDec(&sched, &curr); tospec(&sched, &delay); for (;;) { /* loop to catch early wakeup by nanosleep */ sts = nanosleep(&delay, &left); if (sts == 0 || (sts < 0 && oserror() != EINTR)) break; delay = left; } }