1 /* emikulic@gmail.com was here 2013 */
2 #define _GNU_SOURCE /* for O_NOATIME and O_DIRECT */
14 static const char scratch_file_name
[] = "scratch";
15 /* also block and fragment size of root fs: */
16 static const size_t buf_size
= 4096;
17 /* write at most this often: */
18 static const int period_usec
= 500000;
24 if (posix_memalign((void**)(&buf
), buf_size
, buf_size
) != 0)
25 errx(1, "posix_memalign() failed");
27 if ((fd
= open(scratch_file_name
,
28 O_CREAT
| O_TRUNC
| O_NOATIME
| O_RDWR
| O_DIRECT
,
30 err(1, "open() failed");
31 /* O_SYNC doesn't seem to be needed here. */
35 struct timespec t1
, t2
, tr
;
36 int diff_sec
, diff_nsec
, sleep_len
;
38 if (clock_gettime(CLOCK_REALTIME
, &tr
) == -1)
39 err(1, "clock_gettime() failed");
40 if (clock_gettime(CLOCK_MONOTONIC
, &t1
) == -1)
41 err(1, "clock_gettime() failed");
43 ret
= pwrite(fd
, buf
, buf_size
, 0);
45 err(1, "pwrite() failed (errno=%d)", errno
);
47 warn("pwrite() returned %d, expected %d", (int)ret
, (int)buf_size
);
49 if (clock_gettime(CLOCK_MONOTONIC
, &t2
) == -1)
50 err(1, "clock_gettime() failed");
52 diff_sec
= t2
.tv_sec
- t1
.tv_sec
;
53 diff_nsec
= t2
.tv_nsec
- t1
.tv_nsec
;
56 diff_nsec
+= 1000000000;
59 printf("r %d.%09d m %d.%09d wr %d.%09d\n",
60 (int)tr
.tv_sec
, (int)tr
.tv_nsec
,
61 (int)t1
.tv_sec
, (int)t1
.tv_nsec
,
68 sleep_len
= period_usec
- diff_nsec
/ 1000;
76 /* vim:set ts=2 sw=2 et tw=80: */