int main(void) { timer_t tm1; struct itimerspec its1, its2; struct sigevent se; struct sigaction act; int signum = SIGRTMAX; /* Set up signal handler: */ sigfillset(&act.sa_mask); act.sa_flags = 0; act.sa_handler = sigalarm; sigaction(signum, &act, NULL); /* Set up timer: */ memset(&se, 0, sizeof(se)); se.sigev_notify = SIGEV_SIGNAL; se.sigev_signo = signum; se.sigev_value.sival_int = 0; for (alarm_clock_id = CLOCK_REALTIME_ALARM; alarm_clock_id <= CLOCK_BOOTTIME_ALARM; alarm_clock_id++) { alarmcount = 0; if (timer_create(alarm_clock_id, &se, &tm1) == -1) { printf("timer_create failed, %s unsupported?\n", clockstring(alarm_clock_id)); break; } clock_gettime(alarm_clock_id, &start_time); printf("Start time (%s): %ld:%ld\n", clockstring(alarm_clock_id), start_time.tv_sec, start_time.tv_nsec); printf("Setting alarm for every %i seconds\n", SUSPEND_SECS); its1.it_value = start_time; its1.it_value.tv_sec += SUSPEND_SECS; its1.it_interval.tv_sec = SUSPEND_SECS; its1.it_interval.tv_nsec = 0; timer_settime(tm1, TIMER_ABSTIME, &its1, &its2); while (alarmcount < 5) sleep(1); /* First 5 alarms, do nothing */ printf("Starting suspend loops\n"); while (alarmcount < 10) { int ret; sleep(3); ret = system("echo mem > /sys/power/state"); if (ret) break; } timer_delete(tm1); } if (final_ret) return ksft_exit_fail(); return ksft_exit_pass(); }
int main(int argc, char **argv) { long long length; int clockid, ret; for (clockid = CLOCK_REALTIME; clockid < NR_CLOCKIDS; clockid++) { /* Skip cputime clockids since nanosleep won't increment cputime */ if (clockid == CLOCK_PROCESS_CPUTIME_ID || clockid == CLOCK_THREAD_CPUTIME_ID || clockid == CLOCK_HWSPECIFIC) continue; printf("Nanosleep %-31s ", clockstring(clockid)); length = 10; while (length <= (NSEC_PER_SEC * 10)) { ret = nanosleep_test(clockid, length); if (ret == UNSUPPORTED) { printf("[UNSUPPORTED]\n"); goto next; } if (ret < 0) { printf("[FAILED]\n"); return ksft_exit_fail(); } length *= 100; } printf("[OK]\n"); next: ret = 0; } return ksft_exit_pass(); }