1// RUN: %clangxx -O0 -g %s -o %t && %run %t | FileCheck %s
2#include <assert.h>
3#include <stdio.h>
4#include <string.h>
5#include <time.h>
6#include <sys/timerfd.h>
7#include <unistd.h>
8
9int main (int argc, char** argv)
10{
11  int fd = timerfd_create(CLOCK_REALTIME, 0);
12  assert(fd >= 0);
13
14  struct itimerspec its;
15  its.it_value.tv_sec = 0;
16  its.it_value.tv_nsec = 1000000;
17  its.it_interval.tv_sec = its.it_value.tv_sec;
18  its.it_interval.tv_nsec = its.it_value.tv_nsec;
19
20  int res = timerfd_settime(fd, 0, &its, NULL);
21  assert(res != -1);
22
23  struct itimerspec its2;
24  res = timerfd_settime(fd, 0, &its, &its2);
25  assert(res != -1);
26  assert(its2.it_interval.tv_sec == its.it_interval.tv_sec);
27  assert(its2.it_interval.tv_nsec == its.it_interval.tv_nsec);
28  assert(its2.it_value.tv_sec <= its.it_value.tv_sec);
29  assert(its2.it_value.tv_nsec <= its.it_value.tv_nsec);
30
31  struct itimerspec its3;
32  res = timerfd_gettime(fd, &its3);
33  assert(res != -1);
34  assert(its3.it_interval.tv_sec == its.it_interval.tv_sec);
35  assert(its3.it_interval.tv_nsec == its.it_interval.tv_nsec);
36  assert(its3.it_value.tv_sec <= its.it_value.tv_sec);
37  assert(its3.it_value.tv_nsec <= its.it_value.tv_nsec);
38
39
40  unsigned long long buf;
41  res = read(fd, &buf, sizeof(buf));
42  assert(res == 8);
43  assert(buf >= 1);
44
45  res = close(fd);
46  assert(res != -1);
47
48  printf("DONE\n");
49  // CHECK: DONE
50
51  return 0;
52}
53