Imported Upstream version 0.3.113
[platform/upstream/libaio.git] / harness / cases / 16.t
1 /* 16.t
2 - eventfd tests.
3 */
4 #include <stdint.h>
5 #include <err.h>
6 #include <sys/syscall.h>   /* For SYS_xxx definitions */
7
8 #ifndef SYS_eventfd
9 #if defined(__i386__)
10 #define SYS_eventfd 323
11 #elif defined(__x86_64__)
12 #define SYS_eventfd 284
13 #elif defined(__ia64__)
14 #define SYS_eventfd 1309
15 #elif defined(__PPC__)
16 #define SYS_eventfd 307
17 #elif defined(__s390__)
18 #define SYS_eventfd 318
19 #elif defined(__alpha__)
20 #define SYS_eventfd 478
21 #elif defined(__aarch64__) || defined(__loongarch__) || defined(__riscv)
22 /* these recent architectures do not implement eventfd, only eventfd2 */
23 #define USE_EVENTFD2
24 #ifndef SYS_eventfd2
25 #define SYS_eventfd2 19
26 #endif /* __aarch64__ || __riscv */
27 #else
28 #error define SYS_eventfd for your arch!
29 #endif
30 #endif
31
32 int test_main(void)
33 {
34         /* 10 MB takes long enough that we would fail if eventfd
35          * returned immediately. */
36 #define SIZE    10000000
37         char *buf;
38         struct io_event io_event;
39         struct iocb iocb;
40         struct iocb *iocbs[] = { &iocb };
41         int rwfd, efd;
42         int res;
43         io_context_t    io_ctx;
44         uint64_t event;
45         struct timespec notime = { .tv_sec = 0, .tv_nsec = 0 };
46
47         buf = malloc(SIZE);                             assert(buf);
48 #ifndef USE_EVENTFD2
49         efd = syscall(SYS_eventfd, 0);
50 #else
51         efd = syscall(SYS_eventfd2, 0, 0);
52 #endif
53         if (efd < 0) {
54                 if (errno == ENOSYS) {
55                         printf("No eventfd support.  [SKIPPING]\n");
56                         exit(0);
57                 }
58                 err(1, "Failed to get eventfd");
59         }
60
61         rwfd = open("testdir/rwfile", O_RDWR);          assert(rwfd != -1);
62         res = ftruncate(rwfd, 0);                       assert(res == 0);
63         memset(buf, 0x42, SIZE);
64
65         /* Write test. */
66         res = io_queue_init(1024, &io_ctx);             assert(res == 0);
67         io_prep_pwrite(&iocb, rwfd, buf, SIZE, 0);
68         io_set_eventfd(&iocb, efd);
69         res = io_submit(io_ctx, 1, iocbs);              assert(res == 1);
70
71         alarm(30);
72         res = read(efd, &event, sizeof(event));         assert(res == sizeof(event));
73         assert(event == 1);
74
75         /* This should now be ready. */
76         res = io_getevents(io_ctx, 0, 1, &io_event, &notime);
77         if (res != 1)
78                 err(1, "io_getevents did not return 1 event after eventfd");
79         assert(io_event.res == SIZE);
80         printf("eventfd write test [SUCCESS]\n");
81
82         /* Read test. */
83         memset(buf, 0, SIZE);
84         io_prep_pread(&iocb, rwfd, buf, SIZE, 0);
85         io_set_eventfd(&iocb, efd);
86         res = io_submit(io_ctx, 1, iocbs);              assert(res == 1);
87
88         alarm(30);
89         res = read(efd, &event, sizeof(event));         assert(res == sizeof(event));
90         assert(event == 1);
91
92         /* This should now be ready. */
93         res = io_getevents(io_ctx, 0, 1, &io_event, &notime);
94         if (res != 1)
95                 err(1, "io_getevents did not return 1 event after eventfd");
96         assert(io_event.res == SIZE);
97
98         for (res = 0; res < SIZE; res++)
99                 assert(buf[res] == 0x42);
100         printf("eventfd read test  [SUCCESS]\n");
101
102         return 0;
103 }
104