]>
git.saurik.com Git - apple/xnu.git/blob - tools/tests/darwintests/kqueue_fifo_18776047.c
a2e30174acdf999c306eee91c6b0cd915fc8a02b
2 * testname: kqueue_fifo
5 #include <darwintest.h>
14 #define TMP_FILE_PATH "/tmp/test_kqueue_fifo_18776047"
16 #define READ_BUFFER_LEN 256
18 #if defined(PLATFORM_WatchOS)
19 #define TOTAL_ITERATIONS 5000
21 #define TOTAL_ITERATIONS 10000
25 int write_some_data(int fd
);
26 int read_data(int fd
);
27 void create_fifo(const char * filepath
);
28 void kevent_one_shot(int kq
, int fd
, int filter
);
31 write_some_data(int fd
)
36 char * data
= "ABCDE";
39 retval
= (int)write(fd
, data
, (size_t)len
);
41 if (errno
== EAGAIN
) {
47 T_ASSERT_FAIL("write to fd %d of %s of len %d failed.", fd
, data
, len
);
59 int retval
, count
= 0;
60 char databuffer
[READ_BUFFER_LEN
];
63 retval
= (int)read(fd
, databuffer
, READ_BUFFER_LEN
);
65 if (errno
== EAGAIN
) {
68 T_ASSERT_FAIL("read from fd %d failed.", fd
);
77 create_fifo(const char * filepath
)
82 ret
= stat(filepath
, &f_stat
);
84 /* if file exists, make sure its a fifo */
85 T_ASSERT_TRUE(S_ISFIFO(f_stat
.st_mode
), "ensure %s is a fifo", filepath
);
86 } else if (errno
== ENOENT
) {
87 ret
= mkfifo(filepath
, 0777);
88 T_ASSERT_POSIX_ZERO(ret
, "creating a fifo at path %s", filepath
);
90 T_ASSERT_FAIL("stat operation on %s", filepath
);
95 kevent_one_shot(int kq
, int fd
, int filter
)
98 struct timespec t_zero
= {0, 0};
102 T_ASSERT_GE(kq
, 0, "ensure kq is valid");
103 T_LOG("kevent doing ONESHOT %s", filter
== EVFILT_READ
? "read" : "write");
105 EV_SET(kev
, fd
, filter
, EV_ADD
| EV_ONESHOT
, 0, 0, NULL
);
106 retval
= kevent(kq
, kev
, 1, NULL
, 0, &t_zero
);
108 T_ASSERT_POSIX_ZERO(retval
, "ONESHOT kevent for fd %d, filter %d", fd
, filter
);
111 T_DECL(kqueue_fifo_18776047
, "Tests kqueue, kevent for watching a fifo.", T_META_LTEPHASE(LTE_POSTINIT
))
113 struct kevent kev
[1];
114 int read_fd
, write_fd
, kq
;
117 const char * fpath
= TMP_FILE_PATH
;
122 T_ASSERT_GE(kq
, 0, "create a kqueue");
124 read_fd
= open(fpath
, O_RDONLY
| O_APPEND
| O_NONBLOCK
);
125 T_ASSERT_POSIX_SUCCESS(read_fd
, "opening read fd on fifo.");
127 write_fd
= open(fpath
, O_WRONLY
| O_APPEND
| O_NONBLOCK
);
128 T_ASSERT_POSIX_SUCCESS(write_fd
, "opening write fd on fifo.");
132 kevent_one_shot(kq
, write_fd
, EVFILT_WRITE
);
133 kevent_one_shot(kq
, read_fd
, EVFILT_READ
);
135 while (iter
++ < TOTAL_ITERATIONS
) {
136 retval
= kevent(kq
, NULL
, 0, kev
, 1, NULL
);
138 T_ASSERT_GE(retval
, 0, "kevent on kq %d", kq
);
140 if (kev
[0].ident
== (uintptr_t)write_fd
) {
141 retval
= write_some_data(write_fd
);
142 T_LOG("writer ready iter: %d wrote %d bytes", iter
, retval
);
143 kevent_one_shot(kq
, write_fd
, EVFILT_WRITE
);
144 } else if (kev
[0].ident
== (uintptr_t)read_fd
) {
145 retval
= read_data(read_fd
);
146 T_LOG("reader ready iter: %d read %d bytes", iter
, retval
);
147 kevent_one_shot(kq
, read_fd
, EVFILT_READ
);
150 T_PASS("kqueue_fifo_18776047 PASSED");