1 /* SPDX-License-Identifier: MIT */
2 #include <stdio.h>
3 #include <time.h>
4 #include <sys/time.h>
5 #include "liburing.h"
6
mtime_since(const struct timeval * s,const struct timeval * e)7 static unsigned long long mtime_since(const struct timeval *s,
8 const struct timeval *e)
9 {
10 long long sec, usec;
11
12 sec = e->tv_sec - s->tv_sec;
13 usec = (e->tv_usec - s->tv_usec);
14 if (sec > 0 && usec < 0) {
15 sec--;
16 usec += 1000000;
17 }
18
19 sec *= 1000;
20 usec /= 1000;
21 return sec + usec;
22 }
23
mtime_since_now(struct timeval * tv)24 static unsigned long long mtime_since_now(struct timeval *tv)
25 {
26 struct timeval end;
27
28 gettimeofday(&end, NULL);
29 return mtime_since(tv, &end);
30 }
31
main(int argc,char * argv[])32 int main(int argc, char *argv[])
33 {
34 struct __kernel_timespec ts1, ts2;
35 struct io_uring_cqe *cqe;
36 struct io_uring_sqe *sqe;
37 struct io_uring ring;
38 unsigned long msec;
39 struct timeval tv;
40 int ret;
41
42 if (argc > 1)
43 return 0;
44
45 ret = io_uring_queue_init(32, &ring, 0);
46 if (ret) {
47 fprintf(stderr, "io_uring_queue_init=%d\n", ret);
48 return 1;
49 }
50
51 sqe = io_uring_get_sqe(&ring);
52 io_uring_prep_nop(sqe);
53 ret = io_uring_submit(&ring);
54 if (ret != 1) {
55 fprintf(stderr, "io_uring_submit1=%d\n", ret);
56 return 1;
57 }
58
59
60 ts1.tv_sec = 5,
61 ts1.tv_nsec = 0;
62 ret = io_uring_wait_cqe_timeout(&ring, &cqe, &ts1);
63 if (ret) {
64 fprintf(stderr, "io_uring_wait_cqe_timeout=%d\n", ret);
65 return 1;
66 }
67 io_uring_cqe_seen(&ring, cqe);
68 gettimeofday(&tv, NULL);
69
70 ts2.tv_sec = 1;
71 ts2.tv_nsec = 0;
72 sqe = io_uring_get_sqe(&ring);
73 io_uring_prep_timeout(sqe, &ts2, 0, 0);
74 sqe->user_data = 89;
75 ret = io_uring_submit(&ring);
76 if (ret != 1) {
77 fprintf(stderr, "io_uring_submit2=%d\n", ret);
78 return 1;
79 }
80
81 io_uring_wait_cqe(&ring, &cqe);
82 io_uring_cqe_seen(&ring, cqe);
83 msec = mtime_since_now(&tv);
84 if (msec >= 900 && msec <= 1100) {
85 io_uring_queue_exit(&ring);
86 return 0;
87 }
88
89 fprintf(stderr, "%s: Timeout seems wonky (got %lu)\n", __FUNCTION__,
90 msec);
91 io_uring_queue_exit(&ring);
92 return 1;
93 }
94