xref: /aosp_15_r20/external/liburing/test/7ad0e4b2f83c.c (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
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