6 #include <sys/syscall.h> /* For SYS_xxx definitions */
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 */
25 #define SYS_eventfd2 19
26 #endif /* __aarch64__ || __riscv */
28 #error define SYS_eventfd for your arch!
34 /* 10 MB takes long enough that we would fail if eventfd
35 * returned immediately. */
38 struct io_event io_event;
40 struct iocb *iocbs[] = { &iocb };
45 struct timespec notime = { .tv_sec = 0, .tv_nsec = 0 };
47 buf = malloc(SIZE); assert(buf);
49 efd = syscall(SYS_eventfd, 0);
51 efd = syscall(SYS_eventfd2, 0, 0);
54 if (errno == ENOSYS) {
55 printf("No eventfd support. [SKIPPING]\n");
58 err(1, "Failed to get eventfd");
61 rwfd = open("testdir/rwfile", O_RDWR); assert(rwfd != -1);
62 res = ftruncate(rwfd, 0); assert(res == 0);
63 memset(buf, 0x42, SIZE);
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);
72 res = read(efd, &event, sizeof(event)); assert(res == sizeof(event));
75 /* This should now be ready. */
76 res = io_getevents(io_ctx, 0, 1, &io_event, ¬ime);
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");
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);
89 res = read(efd, &event, sizeof(event)); assert(res == sizeof(event));
92 /* This should now be ready. */
93 res = io_getevents(io_ctx, 0, 1, &io_event, ¬ime);
95 err(1, "io_getevents did not return 1 event after eventfd");
96 assert(io_event.res == SIZE);
98 for (res = 0; res < SIZE; res++)
99 assert(buf[res] == 0x42);
100 printf("eventfd read test [SUCCESS]\n");