xref: /linux/tools/testing/selftests/filesystems/epoll/epoll_wakeup_test.c (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #define _GNU_SOURCE
4 #include <asm/unistd.h>
5 #include <linux/time_types.h>
6 #include <poll.h>
7 #include <unistd.h>
8 #include <assert.h>
9 #include <signal.h>
10 #include <pthread.h>
11 #include <sys/epoll.h>
12 #include <sys/socket.h>
13 #include <sys/eventfd.h>
14 #include "../../kselftest_harness.h"
15 
16 struct epoll_mtcontext
17 {
18 	int efd[3];
19 	int sfd[4];
20 	volatile int count;
21 
22 	pthread_t main;
23 	pthread_t waiter;
24 };
25 
26 #ifndef __NR_epoll_pwait2
27 #define __NR_epoll_pwait2 -1
28 #endif
29 
sys_epoll_pwait2(int fd,struct epoll_event * events,int maxevents,const struct __kernel_timespec * timeout,const sigset_t * sigset,size_t sigsetsize)30 static inline int sys_epoll_pwait2(int fd, struct epoll_event *events,
31 				   int maxevents,
32 				   const struct __kernel_timespec *timeout,
33 				   const sigset_t *sigset, size_t sigsetsize)
34 {
35 	return syscall(__NR_epoll_pwait2, fd, events, maxevents, timeout,
36 		       sigset, sigsetsize);
37 }
38 
signal_handler(int signum)39 static void signal_handler(int signum)
40 {
41 }
42 
kill_timeout(struct epoll_mtcontext * ctx)43 static void kill_timeout(struct epoll_mtcontext *ctx)
44 {
45 	usleep(1000000);
46 	pthread_kill(ctx->main, SIGUSR1);
47 	pthread_kill(ctx->waiter, SIGUSR1);
48 }
49 
waiter_entry1a(void * data)50 static void *waiter_entry1a(void *data)
51 {
52 	struct epoll_event e;
53 	struct epoll_mtcontext *ctx = data;
54 
55 	if (epoll_wait(ctx->efd[0], &e, 1, -1) > 0)
56 		__sync_fetch_and_add(&ctx->count, 1);
57 
58 	return NULL;
59 }
60 
waiter_entry1ap(void * data)61 static void *waiter_entry1ap(void *data)
62 {
63 	struct pollfd pfd;
64 	struct epoll_event e;
65 	struct epoll_mtcontext *ctx = data;
66 
67 	pfd.fd = ctx->efd[0];
68 	pfd.events = POLLIN;
69 	if (poll(&pfd, 1, -1) > 0) {
70 		if (epoll_wait(ctx->efd[0], &e, 1, 0) > 0)
71 			__sync_fetch_and_add(&ctx->count, 1);
72 	}
73 
74 	return NULL;
75 }
76 
waiter_entry1o(void * data)77 static void *waiter_entry1o(void *data)
78 {
79 	struct epoll_event e;
80 	struct epoll_mtcontext *ctx = data;
81 
82 	if (epoll_wait(ctx->efd[0], &e, 1, -1) > 0)
83 		__sync_fetch_and_or(&ctx->count, 1);
84 
85 	return NULL;
86 }
87 
waiter_entry1op(void * data)88 static void *waiter_entry1op(void *data)
89 {
90 	struct pollfd pfd;
91 	struct epoll_event e;
92 	struct epoll_mtcontext *ctx = data;
93 
94 	pfd.fd = ctx->efd[0];
95 	pfd.events = POLLIN;
96 	if (poll(&pfd, 1, -1) > 0) {
97 		if (epoll_wait(ctx->efd[0], &e, 1, 0) > 0)
98 			__sync_fetch_and_or(&ctx->count, 1);
99 	}
100 
101 	return NULL;
102 }
103 
waiter_entry2a(void * data)104 static void *waiter_entry2a(void *data)
105 {
106 	struct epoll_event events[2];
107 	struct epoll_mtcontext *ctx = data;
108 
109 	if (epoll_wait(ctx->efd[0], events, 2, -1) > 0)
110 		__sync_fetch_and_add(&ctx->count, 1);
111 
112 	return NULL;
113 }
114 
waiter_entry2ap(void * data)115 static void *waiter_entry2ap(void *data)
116 {
117 	struct pollfd pfd;
118 	struct epoll_event events[2];
119 	struct epoll_mtcontext *ctx = data;
120 
121 	pfd.fd = ctx->efd[0];
122 	pfd.events = POLLIN;
123 	if (poll(&pfd, 1, -1) > 0) {
124 		if (epoll_wait(ctx->efd[0], events, 2, 0) > 0)
125 			__sync_fetch_and_add(&ctx->count, 1);
126 	}
127 
128 	return NULL;
129 }
130 
emitter_entry1(void * data)131 static void *emitter_entry1(void *data)
132 {
133 	struct epoll_mtcontext *ctx = data;
134 
135 	usleep(100000);
136 	write(ctx->sfd[1], "w", 1);
137 
138 	kill_timeout(ctx);
139 
140 	return NULL;
141 }
142 
emitter_entry2(void * data)143 static void *emitter_entry2(void *data)
144 {
145 	struct epoll_mtcontext *ctx = data;
146 
147 	usleep(100000);
148 	write(ctx->sfd[1], "w", 1);
149 	write(ctx->sfd[3], "w", 1);
150 
151 	kill_timeout(ctx);
152 
153 	return NULL;
154 }
155 
156 /*
157  *          t0
158  *           | (ew)
159  *          e0
160  *           | (lt)
161  *          s0
162  */
TEST(epoll1)163 TEST(epoll1)
164 {
165 	int efd;
166 	int sfd[2];
167 	struct epoll_event e;
168 
169 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
170 
171 	efd = epoll_create(1);
172 	ASSERT_GE(efd, 0);
173 
174 	e.events = EPOLLIN;
175 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);
176 
177 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
178 
179 	EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 1);
180 	EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 1);
181 
182 	close(efd);
183 	close(sfd[0]);
184 	close(sfd[1]);
185 }
186 
187 /*
188  *          t0
189  *           | (ew)
190  *          e0
191  *           | (et)
192  *          s0
193  */
TEST(epoll2)194 TEST(epoll2)
195 {
196 	int efd;
197 	int sfd[2];
198 	struct epoll_event e;
199 
200 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
201 
202 	efd = epoll_create(1);
203 	ASSERT_GE(efd, 0);
204 
205 	e.events = EPOLLIN | EPOLLET;
206 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);
207 
208 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
209 
210 	EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 1);
211 	EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 0);
212 
213 	close(efd);
214 	close(sfd[0]);
215 	close(sfd[1]);
216 }
217 
218 /*
219  *           t0
220  *            | (ew)
221  *           e0
222  *     (lt) /  \ (lt)
223  *        s0    s2
224  */
TEST(epoll3)225 TEST(epoll3)
226 {
227 	int efd;
228 	int sfd[4];
229 	struct epoll_event events[2];
230 
231 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
232 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
233 
234 	efd = epoll_create(1);
235 	ASSERT_GE(efd, 0);
236 
237 	events[0].events = EPOLLIN;
238 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);
239 
240 	events[0].events = EPOLLIN;
241 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);
242 
243 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
244 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
245 
246 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);
247 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);
248 
249 	close(efd);
250 	close(sfd[0]);
251 	close(sfd[1]);
252 	close(sfd[2]);
253 	close(sfd[3]);
254 }
255 
256 /*
257  *           t0
258  *            | (ew)
259  *           e0
260  *     (et) /  \ (et)
261  *        s0    s2
262  */
TEST(epoll4)263 TEST(epoll4)
264 {
265 	int efd;
266 	int sfd[4];
267 	struct epoll_event events[2];
268 
269 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
270 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
271 
272 	efd = epoll_create(1);
273 	ASSERT_GE(efd, 0);
274 
275 	events[0].events = EPOLLIN | EPOLLET;
276 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);
277 
278 	events[0].events = EPOLLIN | EPOLLET;
279 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);
280 
281 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
282 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
283 
284 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);
285 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 0);
286 
287 	close(efd);
288 	close(sfd[0]);
289 	close(sfd[1]);
290 	close(sfd[2]);
291 	close(sfd[3]);
292 }
293 
294 /*
295  *          t0
296  *           | (p)
297  *          e0
298  *           | (lt)
299  *          s0
300  */
TEST(epoll5)301 TEST(epoll5)
302 {
303 	int efd;
304 	int sfd[2];
305 	struct pollfd pfd;
306 	struct epoll_event e;
307 
308 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
309 
310 	efd = epoll_create(1);
311 	ASSERT_GE(efd, 0);
312 
313 	e.events = EPOLLIN;
314 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);
315 
316 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
317 
318 	pfd.fd = efd;
319 	pfd.events = POLLIN;
320 	ASSERT_EQ(poll(&pfd, 1, 0), 1);
321 	ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 1);
322 
323 	pfd.fd = efd;
324 	pfd.events = POLLIN;
325 	ASSERT_EQ(poll(&pfd, 1, 0), 1);
326 	ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 1);
327 
328 	close(efd);
329 	close(sfd[0]);
330 	close(sfd[1]);
331 }
332 
333 /*
334  *          t0
335  *           | (p)
336  *          e0
337  *           | (et)
338  *          s0
339  */
TEST(epoll6)340 TEST(epoll6)
341 {
342 	int efd;
343 	int sfd[2];
344 	struct pollfd pfd;
345 	struct epoll_event e;
346 
347 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
348 
349 	efd = epoll_create(1);
350 	ASSERT_GE(efd, 0);
351 
352 	e.events = EPOLLIN | EPOLLET;
353 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);
354 
355 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
356 
357 	pfd.fd = efd;
358 	pfd.events = POLLIN;
359 	ASSERT_EQ(poll(&pfd, 1, 0), 1);
360 	ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 1);
361 
362 	pfd.fd = efd;
363 	pfd.events = POLLIN;
364 	ASSERT_EQ(poll(&pfd, 1, 0), 0);
365 	ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 0);
366 
367 	close(efd);
368 	close(sfd[0]);
369 	close(sfd[1]);
370 }
371 
372 /*
373  *           t0
374  *            | (p)
375  *           e0
376  *     (lt) /  \ (lt)
377  *        s0    s2
378  */
379 
TEST(epoll7)380 TEST(epoll7)
381 {
382 	int efd;
383 	int sfd[4];
384 	struct pollfd pfd;
385 	struct epoll_event events[2];
386 
387 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
388 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
389 
390 	efd = epoll_create(1);
391 	ASSERT_GE(efd, 0);
392 
393 	events[0].events = EPOLLIN;
394 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);
395 
396 	events[0].events = EPOLLIN;
397 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);
398 
399 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
400 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
401 
402 	pfd.fd = efd;
403 	pfd.events = POLLIN;
404 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
405 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);
406 
407 	pfd.fd = efd;
408 	pfd.events = POLLIN;
409 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
410 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);
411 
412 	close(efd);
413 	close(sfd[0]);
414 	close(sfd[1]);
415 	close(sfd[2]);
416 	close(sfd[3]);
417 }
418 
419 /*
420  *           t0
421  *            | (p)
422  *           e0
423  *     (et) /  \ (et)
424  *        s0    s2
425  */
TEST(epoll8)426 TEST(epoll8)
427 {
428 	int efd;
429 	int sfd[4];
430 	struct pollfd pfd;
431 	struct epoll_event events[2];
432 
433 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
434 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
435 
436 	efd = epoll_create(1);
437 	ASSERT_GE(efd, 0);
438 
439 	events[0].events = EPOLLIN | EPOLLET;
440 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);
441 
442 	events[0].events = EPOLLIN | EPOLLET;
443 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);
444 
445 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
446 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
447 
448 	pfd.fd = efd;
449 	pfd.events = POLLIN;
450 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
451 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);
452 
453 	pfd.fd = efd;
454 	pfd.events = POLLIN;
455 	EXPECT_EQ(poll(&pfd, 1, 0), 0);
456 	EXPECT_EQ(epoll_wait(efd, events, 2, 0), 0);
457 
458 	close(efd);
459 	close(sfd[0]);
460 	close(sfd[1]);
461 	close(sfd[2]);
462 	close(sfd[3]);
463 }
464 
465 /*
466  *        t0    t1
467  *     (ew) \  / (ew)
468  *           e0
469  *            | (lt)
470  *           s0
471  */
TEST(epoll9)472 TEST(epoll9)
473 {
474 	pthread_t emitter;
475 	struct epoll_event e;
476 	struct epoll_mtcontext ctx = { 0 };
477 
478 	signal(SIGUSR1, signal_handler);
479 
480 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
481 
482 	ctx.efd[0] = epoll_create(1);
483 	ASSERT_GE(ctx.efd[0], 0);
484 
485 	e.events = EPOLLIN;
486 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
487 
488 	ctx.main = pthread_self();
489 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
490 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
491 
492 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
493 		__sync_fetch_and_add(&ctx.count, 1);
494 
495 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
496 	EXPECT_EQ(ctx.count, 2);
497 
498 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
499 		pthread_kill(emitter, SIGUSR1);
500 		pthread_join(emitter, NULL);
501 	}
502 
503 	close(ctx.efd[0]);
504 	close(ctx.sfd[0]);
505 	close(ctx.sfd[1]);
506 }
507 
508 /*
509  *        t0    t1
510  *     (ew) \  / (ew)
511  *           e0
512  *            | (et)
513  *           s0
514  */
TEST(epoll10)515 TEST(epoll10)
516 {
517 	pthread_t emitter;
518 	struct epoll_event e;
519 	struct epoll_mtcontext ctx = { 0 };
520 
521 	signal(SIGUSR1, signal_handler);
522 
523 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
524 
525 	ctx.efd[0] = epoll_create(1);
526 	ASSERT_GE(ctx.efd[0], 0);
527 
528 	e.events = EPOLLIN | EPOLLET;
529 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
530 
531 	ctx.main = pthread_self();
532 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
533 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
534 
535 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
536 		__sync_fetch_and_add(&ctx.count, 1);
537 
538 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
539 	EXPECT_EQ(ctx.count, 1);
540 
541 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
542 		pthread_kill(emitter, SIGUSR1);
543 		pthread_join(emitter, NULL);
544 	}
545 
546 	close(ctx.efd[0]);
547 	close(ctx.sfd[0]);
548 	close(ctx.sfd[1]);
549 }
550 
551 /*
552  *        t0    t1
553  *     (ew) \  / (ew)
554  *           e0
555  *     (lt) /  \ (lt)
556  *        s0    s2
557  */
TEST(epoll11)558 TEST(epoll11)
559 {
560 	pthread_t emitter;
561 	struct epoll_event events[2];
562 	struct epoll_mtcontext ctx = { 0 };
563 
564 	signal(SIGUSR1, signal_handler);
565 
566 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
567 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
568 
569 	ctx.efd[0] = epoll_create(1);
570 	ASSERT_GE(ctx.efd[0], 0);
571 
572 	events[0].events = EPOLLIN;
573 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);
574 
575 	events[0].events = EPOLLIN;
576 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);
577 
578 	ctx.main = pthread_self();
579 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry2a, &ctx), 0);
580 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
581 
582 	if (epoll_wait(ctx.efd[0], events, 2, -1) > 0)
583 		__sync_fetch_and_add(&ctx.count, 1);
584 
585 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
586 	EXPECT_EQ(ctx.count, 2);
587 
588 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
589 		pthread_kill(emitter, SIGUSR1);
590 		pthread_join(emitter, NULL);
591 	}
592 
593 	close(ctx.efd[0]);
594 	close(ctx.sfd[0]);
595 	close(ctx.sfd[1]);
596 	close(ctx.sfd[2]);
597 	close(ctx.sfd[3]);
598 }
599 
600 /*
601  *        t0    t1
602  *     (ew) \  / (ew)
603  *           e0
604  *     (et) /  \ (et)
605  *        s0    s2
606  */
TEST(epoll12)607 TEST(epoll12)
608 {
609 	pthread_t emitter;
610 	struct epoll_event events[2];
611 	struct epoll_mtcontext ctx = { 0 };
612 
613 	signal(SIGUSR1, signal_handler);
614 
615 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
616 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
617 
618 	ctx.efd[0] = epoll_create(1);
619 	ASSERT_GE(ctx.efd[0], 0);
620 
621 	events[0].events = EPOLLIN | EPOLLET;
622 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);
623 
624 	events[0].events = EPOLLIN | EPOLLET;
625 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);
626 
627 	ctx.main = pthread_self();
628 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
629 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
630 
631 	if (epoll_wait(ctx.efd[0], events, 1, -1) > 0)
632 		__sync_fetch_and_add(&ctx.count, 1);
633 
634 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
635 	EXPECT_EQ(ctx.count, 2);
636 
637 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
638 		pthread_kill(emitter, SIGUSR1);
639 		pthread_join(emitter, NULL);
640 	}
641 
642 	close(ctx.efd[0]);
643 	close(ctx.sfd[0]);
644 	close(ctx.sfd[1]);
645 	close(ctx.sfd[2]);
646 	close(ctx.sfd[3]);
647 }
648 
649 /*
650  *        t0    t1
651  *     (ew) \  / (p)
652  *           e0
653  *            | (lt)
654  *           s0
655  */
TEST(epoll13)656 TEST(epoll13)
657 {
658 	pthread_t emitter;
659 	struct epoll_event e;
660 	struct epoll_mtcontext ctx = { 0 };
661 
662 	signal(SIGUSR1, signal_handler);
663 
664 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
665 
666 	ctx.efd[0] = epoll_create(1);
667 	ASSERT_GE(ctx.efd[0], 0);
668 
669 	e.events = EPOLLIN;
670 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
671 
672 	ctx.main = pthread_self();
673 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
674 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
675 
676 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
677 		__sync_fetch_and_add(&ctx.count, 1);
678 
679 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
680 	EXPECT_EQ(ctx.count, 2);
681 
682 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
683 		pthread_kill(emitter, SIGUSR1);
684 		pthread_join(emitter, NULL);
685 	}
686 
687 	close(ctx.efd[0]);
688 	close(ctx.sfd[0]);
689 	close(ctx.sfd[1]);
690 }
691 
692 /*
693  *        t0    t1
694  *     (ew) \  / (p)
695  *           e0
696  *            | (et)
697  *           s0
698  */
TEST(epoll14)699 TEST(epoll14)
700 {
701 	pthread_t emitter;
702 	struct epoll_event e;
703 	struct epoll_mtcontext ctx = { 0 };
704 
705 	signal(SIGUSR1, signal_handler);
706 
707 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
708 
709 	ctx.efd[0] = epoll_create(1);
710 	ASSERT_GE(ctx.efd[0], 0);
711 
712 	e.events = EPOLLIN | EPOLLET;
713 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
714 
715 	ctx.main = pthread_self();
716 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
717 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
718 
719 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
720 		__sync_fetch_and_add(&ctx.count, 1);
721 
722 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
723 	EXPECT_EQ(ctx.count, 1);
724 
725 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
726 		pthread_kill(emitter, SIGUSR1);
727 		pthread_join(emitter, NULL);
728 	}
729 
730 	close(ctx.efd[0]);
731 	close(ctx.sfd[0]);
732 	close(ctx.sfd[1]);
733 }
734 
735 /*
736  *        t0    t1
737  *     (ew) \  / (p)
738  *           e0
739  *     (lt) /  \ (lt)
740  *        s0    s2
741  */
TEST(epoll15)742 TEST(epoll15)
743 {
744 	pthread_t emitter;
745 	struct epoll_event events[2];
746 	struct epoll_mtcontext ctx = { 0 };
747 
748 	signal(SIGUSR1, signal_handler);
749 
750 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
751 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
752 
753 	ctx.efd[0] = epoll_create(1);
754 	ASSERT_GE(ctx.efd[0], 0);
755 
756 	events[0].events = EPOLLIN;
757 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);
758 
759 	events[0].events = EPOLLIN;
760 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);
761 
762 	ctx.main = pthread_self();
763 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry2ap, &ctx), 0);
764 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
765 
766 	if (epoll_wait(ctx.efd[0], events, 2, -1) > 0)
767 		__sync_fetch_and_add(&ctx.count, 1);
768 
769 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
770 	EXPECT_EQ(ctx.count, 2);
771 
772 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
773 		pthread_kill(emitter, SIGUSR1);
774 		pthread_join(emitter, NULL);
775 	}
776 
777 	close(ctx.efd[0]);
778 	close(ctx.sfd[0]);
779 	close(ctx.sfd[1]);
780 	close(ctx.sfd[2]);
781 	close(ctx.sfd[3]);
782 }
783 
784 /*
785  *        t0    t1
786  *     (ew) \  / (p)
787  *           e0
788  *     (et) /  \ (et)
789  *        s0    s2
790  */
TEST(epoll16)791 TEST(epoll16)
792 {
793 	pthread_t emitter;
794 	struct epoll_event events[2];
795 	struct epoll_mtcontext ctx = { 0 };
796 
797 	signal(SIGUSR1, signal_handler);
798 
799 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
800 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
801 
802 	ctx.efd[0] = epoll_create(1);
803 	ASSERT_GE(ctx.efd[0], 0);
804 
805 	events[0].events = EPOLLIN | EPOLLET;
806 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);
807 
808 	events[0].events = EPOLLIN | EPOLLET;
809 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);
810 
811 	ctx.main = pthread_self();
812 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
813 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
814 
815 	if (epoll_wait(ctx.efd[0], events, 1, -1) > 0)
816 		__sync_fetch_and_add(&ctx.count, 1);
817 
818 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
819 	EXPECT_EQ(ctx.count, 2);
820 
821 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
822 		pthread_kill(emitter, SIGUSR1);
823 		pthread_join(emitter, NULL);
824 	}
825 
826 	close(ctx.efd[0]);
827 	close(ctx.sfd[0]);
828 	close(ctx.sfd[1]);
829 	close(ctx.sfd[2]);
830 	close(ctx.sfd[3]);
831 }
832 
833 /*
834  *          t0
835  *           | (ew)
836  *          e0
837  *           | (lt)
838  *          e1
839  *           | (lt)
840  *          s0
841  */
TEST(epoll17)842 TEST(epoll17)
843 {
844 	int efd[2];
845 	int sfd[2];
846 	struct epoll_event e;
847 
848 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
849 
850 	efd[0] = epoll_create(1);
851 	ASSERT_GE(efd[0], 0);
852 
853 	efd[1] = epoll_create(1);
854 	ASSERT_GE(efd[1], 0);
855 
856 	e.events = EPOLLIN;
857 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
858 
859 	e.events = EPOLLIN;
860 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
861 
862 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
863 
864 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
865 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
866 
867 	close(efd[0]);
868 	close(efd[1]);
869 	close(sfd[0]);
870 	close(sfd[1]);
871 }
872 
873 /*
874  *          t0
875  *           | (ew)
876  *          e0
877  *           | (lt)
878  *          e1
879  *           | (et)
880  *          s0
881  */
TEST(epoll18)882 TEST(epoll18)
883 {
884 	int efd[2];
885 	int sfd[2];
886 	struct epoll_event e;
887 
888 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
889 
890 	efd[0] = epoll_create(1);
891 	ASSERT_GE(efd[0], 0);
892 
893 	efd[1] = epoll_create(1);
894 	ASSERT_GE(efd[1], 0);
895 
896 	e.events = EPOLLIN | EPOLLET;
897 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
898 
899 	e.events = EPOLLIN;
900 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
901 
902 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
903 
904 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
905 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
906 
907 	close(efd[0]);
908 	close(efd[1]);
909 	close(sfd[0]);
910 	close(sfd[1]);
911 }
912 
913 /*
914  *           t0
915  *            | (ew)
916  *           e0
917  *            | (et)
918  *           e1
919  *            | (lt)
920  *           s0
921  */
TEST(epoll19)922 TEST(epoll19)
923 {
924 	int efd[2];
925 	int sfd[2];
926 	struct epoll_event e;
927 
928 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
929 
930 	efd[0] = epoll_create(1);
931 	ASSERT_GE(efd[0], 0);
932 
933 	efd[1] = epoll_create(1);
934 	ASSERT_GE(efd[1], 0);
935 
936 	e.events = EPOLLIN;
937 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
938 
939 	e.events = EPOLLIN | EPOLLET;
940 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
941 
942 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
943 
944 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
945 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);
946 
947 	close(efd[0]);
948 	close(efd[1]);
949 	close(sfd[0]);
950 	close(sfd[1]);
951 }
952 
953 /*
954  *           t0
955  *            | (ew)
956  *           e0
957  *            | (et)
958  *           e1
959  *            | (et)
960  *           s0
961  */
TEST(epoll20)962 TEST(epoll20)
963 {
964 	int efd[2];
965 	int sfd[2];
966 	struct epoll_event e;
967 
968 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
969 
970 	efd[0] = epoll_create(1);
971 	ASSERT_GE(efd[0], 0);
972 
973 	efd[1] = epoll_create(1);
974 	ASSERT_GE(efd[1], 0);
975 
976 	e.events = EPOLLIN | EPOLLET;
977 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
978 
979 	e.events = EPOLLIN | EPOLLET;
980 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
981 
982 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
983 
984 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
985 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);
986 
987 	close(efd[0]);
988 	close(efd[1]);
989 	close(sfd[0]);
990 	close(sfd[1]);
991 }
992 
993 /*
994  *          t0
995  *           | (p)
996  *          e0
997  *           | (lt)
998  *          e1
999  *           | (lt)
1000  *          s0
1001  */
TEST(epoll21)1002 TEST(epoll21)
1003 {
1004 	int efd[2];
1005 	int sfd[2];
1006 	struct pollfd pfd;
1007 	struct epoll_event e;
1008 
1009 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
1010 
1011 	efd[0] = epoll_create(1);
1012 	ASSERT_GE(efd[0], 0);
1013 
1014 	efd[1] = epoll_create(1);
1015 	ASSERT_GE(efd[1], 0);
1016 
1017 	e.events = EPOLLIN;
1018 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
1019 
1020 	e.events = EPOLLIN;
1021 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
1022 
1023 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
1024 
1025 	pfd.fd = efd[0];
1026 	pfd.events = POLLIN;
1027 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
1028 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
1029 
1030 	pfd.fd = efd[0];
1031 	pfd.events = POLLIN;
1032 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
1033 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
1034 
1035 	close(efd[0]);
1036 	close(efd[1]);
1037 	close(sfd[0]);
1038 	close(sfd[1]);
1039 }
1040 
1041 /*
1042  *          t0
1043  *           | (p)
1044  *          e0
1045  *           | (lt)
1046  *          e1
1047  *           | (et)
1048  *          s0
1049  */
TEST(epoll22)1050 TEST(epoll22)
1051 {
1052 	int efd[2];
1053 	int sfd[2];
1054 	struct pollfd pfd;
1055 	struct epoll_event e;
1056 
1057 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
1058 
1059 	efd[0] = epoll_create(1);
1060 	ASSERT_GE(efd[0], 0);
1061 
1062 	efd[1] = epoll_create(1);
1063 	ASSERT_GE(efd[1], 0);
1064 
1065 	e.events = EPOLLIN | EPOLLET;
1066 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
1067 
1068 	e.events = EPOLLIN;
1069 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
1070 
1071 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
1072 
1073 	pfd.fd = efd[0];
1074 	pfd.events = POLLIN;
1075 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
1076 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
1077 
1078 	pfd.fd = efd[0];
1079 	pfd.events = POLLIN;
1080 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
1081 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
1082 
1083 	close(efd[0]);
1084 	close(efd[1]);
1085 	close(sfd[0]);
1086 	close(sfd[1]);
1087 }
1088 
1089 /*
1090  *          t0
1091  *           | (p)
1092  *          e0
1093  *           | (et)
1094  *          e1
1095  *           | (lt)
1096  *          s0
1097  */
TEST(epoll23)1098 TEST(epoll23)
1099 {
1100 	int efd[2];
1101 	int sfd[2];
1102 	struct pollfd pfd;
1103 	struct epoll_event e;
1104 
1105 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
1106 
1107 	efd[0] = epoll_create(1);
1108 	ASSERT_GE(efd[0], 0);
1109 
1110 	efd[1] = epoll_create(1);
1111 	ASSERT_GE(efd[1], 0);
1112 
1113 	e.events = EPOLLIN;
1114 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
1115 
1116 	e.events = EPOLLIN | EPOLLET;
1117 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
1118 
1119 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
1120 
1121 	pfd.fd = efd[0];
1122 	pfd.events = POLLIN;
1123 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
1124 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
1125 
1126 	pfd.fd = efd[0];
1127 	pfd.events = POLLIN;
1128 	EXPECT_EQ(poll(&pfd, 1, 0), 0);
1129 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);
1130 
1131 	close(efd[0]);
1132 	close(efd[1]);
1133 	close(sfd[0]);
1134 	close(sfd[1]);
1135 }
1136 
1137 /*
1138  *          t0
1139  *           | (p)
1140  *          e0
1141  *           | (et)
1142  *          e1
1143  *           | (et)
1144  *          s0
1145  */
TEST(epoll24)1146 TEST(epoll24)
1147 {
1148 	int efd[2];
1149 	int sfd[2];
1150 	struct pollfd pfd;
1151 	struct epoll_event e;
1152 
1153 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
1154 
1155 	efd[0] = epoll_create(1);
1156 	ASSERT_GE(efd[0], 0);
1157 
1158 	efd[1] = epoll_create(1);
1159 	ASSERT_GE(efd[1], 0);
1160 
1161 	e.events = EPOLLIN | EPOLLET;
1162 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);
1163 
1164 	e.events = EPOLLIN | EPOLLET;
1165 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);
1166 
1167 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
1168 
1169 	pfd.fd = efd[0];
1170 	pfd.events = POLLIN;
1171 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
1172 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);
1173 
1174 	pfd.fd = efd[0];
1175 	pfd.events = POLLIN;
1176 	EXPECT_EQ(poll(&pfd, 1, 0), 0);
1177 	EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);
1178 
1179 	close(efd[0]);
1180 	close(efd[1]);
1181 	close(sfd[0]);
1182 	close(sfd[1]);
1183 }
1184 
1185 /*
1186  *        t0    t1
1187  *     (ew) \  / (ew)
1188  *           e0
1189  *            | (lt)
1190  *           e1
1191  *            | (lt)
1192  *           s0
1193  */
TEST(epoll25)1194 TEST(epoll25)
1195 {
1196 	pthread_t emitter;
1197 	struct epoll_event e;
1198 	struct epoll_mtcontext ctx = { 0 };
1199 
1200 	signal(SIGUSR1, signal_handler);
1201 
1202 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1203 
1204 	ctx.efd[0] = epoll_create(1);
1205 	ASSERT_GE(ctx.efd[0], 0);
1206 
1207 	ctx.efd[1] = epoll_create(1);
1208 	ASSERT_GE(ctx.efd[1], 0);
1209 
1210 	e.events = EPOLLIN;
1211 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1212 
1213 	e.events = EPOLLIN;
1214 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1215 
1216 	ctx.main = pthread_self();
1217 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1218 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1219 
1220 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1221 		__sync_fetch_and_add(&ctx.count, 1);
1222 
1223 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1224 	EXPECT_EQ(ctx.count, 2);
1225 
1226 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1227 		pthread_kill(emitter, SIGUSR1);
1228 		pthread_join(emitter, NULL);
1229 	}
1230 
1231 	close(ctx.efd[0]);
1232 	close(ctx.efd[1]);
1233 	close(ctx.sfd[0]);
1234 	close(ctx.sfd[1]);
1235 }
1236 
1237 /*
1238  *        t0    t1
1239  *     (ew) \  / (ew)
1240  *           e0
1241  *            | (lt)
1242  *           e1
1243  *            | (et)
1244  *           s0
1245  */
TEST(epoll26)1246 TEST(epoll26)
1247 {
1248 	pthread_t emitter;
1249 	struct epoll_event e;
1250 	struct epoll_mtcontext ctx = { 0 };
1251 
1252 	signal(SIGUSR1, signal_handler);
1253 
1254 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1255 
1256 	ctx.efd[0] = epoll_create(1);
1257 	ASSERT_GE(ctx.efd[0], 0);
1258 
1259 	ctx.efd[1] = epoll_create(1);
1260 	ASSERT_GE(ctx.efd[1], 0);
1261 
1262 	e.events = EPOLLIN | EPOLLET;
1263 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1264 
1265 	e.events = EPOLLIN;
1266 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1267 
1268 	ctx.main = pthread_self();
1269 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1270 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1271 
1272 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1273 		__sync_fetch_and_add(&ctx.count, 1);
1274 
1275 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1276 	EXPECT_EQ(ctx.count, 2);
1277 
1278 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1279 		pthread_kill(emitter, SIGUSR1);
1280 		pthread_join(emitter, NULL);
1281 	}
1282 
1283 	close(ctx.efd[0]);
1284 	close(ctx.efd[1]);
1285 	close(ctx.sfd[0]);
1286 	close(ctx.sfd[1]);
1287 }
1288 
1289 /*
1290  *        t0    t1
1291  *     (ew) \  / (ew)
1292  *           e0
1293  *            | (et)
1294  *           e1
1295  *            | (lt)
1296  *           s0
1297  */
TEST(epoll27)1298 TEST(epoll27)
1299 {
1300 	pthread_t emitter;
1301 	struct epoll_event e;
1302 	struct epoll_mtcontext ctx = { 0 };
1303 
1304 	signal(SIGUSR1, signal_handler);
1305 
1306 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1307 
1308 	ctx.efd[0] = epoll_create(1);
1309 	ASSERT_GE(ctx.efd[0], 0);
1310 
1311 	ctx.efd[1] = epoll_create(1);
1312 	ASSERT_GE(ctx.efd[1], 0);
1313 
1314 	e.events = EPOLLIN;
1315 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1316 
1317 	e.events = EPOLLIN | EPOLLET;
1318 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1319 
1320 	ctx.main = pthread_self();
1321 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1322 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1323 
1324 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1325 		__sync_fetch_and_add(&ctx.count, 1);
1326 
1327 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1328 	EXPECT_EQ(ctx.count, 1);
1329 
1330 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1331 		pthread_kill(emitter, SIGUSR1);
1332 		pthread_join(emitter, NULL);
1333 	}
1334 
1335 	close(ctx.efd[0]);
1336 	close(ctx.efd[1]);
1337 	close(ctx.sfd[0]);
1338 	close(ctx.sfd[1]);
1339 }
1340 
1341 /*
1342  *        t0    t1
1343  *     (ew) \  / (ew)
1344  *           e0
1345  *            | (et)
1346  *           e1
1347  *            | (et)
1348  *           s0
1349  */
TEST(epoll28)1350 TEST(epoll28)
1351 {
1352 	pthread_t emitter;
1353 	struct epoll_event e;
1354 	struct epoll_mtcontext ctx = { 0 };
1355 
1356 	signal(SIGUSR1, signal_handler);
1357 
1358 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1359 
1360 	ctx.efd[0] = epoll_create(1);
1361 	ASSERT_GE(ctx.efd[0], 0);
1362 
1363 	ctx.efd[1] = epoll_create(1);
1364 	ASSERT_GE(ctx.efd[1], 0);
1365 
1366 	e.events = EPOLLIN | EPOLLET;
1367 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1368 
1369 	e.events = EPOLLIN | EPOLLET;
1370 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1371 
1372 	ctx.main = pthread_self();
1373 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1374 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1375 
1376 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1377 		__sync_fetch_and_add(&ctx.count, 1);
1378 
1379 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1380 	EXPECT_EQ(ctx.count, 1);
1381 
1382 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1383 		pthread_kill(emitter, SIGUSR1);
1384 		pthread_join(emitter, NULL);
1385 	}
1386 
1387 	close(ctx.efd[0]);
1388 	close(ctx.efd[1]);
1389 	close(ctx.sfd[0]);
1390 	close(ctx.sfd[1]);
1391 }
1392 
1393 /*
1394  *        t0    t1
1395  *     (ew) \  / (p)
1396  *           e0
1397  *            | (lt)
1398  *           e1
1399  *            | (lt)
1400  *           s0
1401  */
TEST(epoll29)1402 TEST(epoll29)
1403 {
1404 	pthread_t emitter;
1405 	struct epoll_event e;
1406 	struct epoll_mtcontext ctx = { 0 };
1407 
1408 	signal(SIGUSR1, signal_handler);
1409 
1410 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1411 
1412 	ctx.efd[0] = epoll_create(1);
1413 	ASSERT_GE(ctx.efd[0], 0);
1414 
1415 	ctx.efd[1] = epoll_create(1);
1416 	ASSERT_GE(ctx.efd[1], 0);
1417 
1418 	e.events = EPOLLIN;
1419 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1420 
1421 	e.events = EPOLLIN;
1422 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1423 
1424 	ctx.main = pthread_self();
1425 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
1426 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1427 
1428 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1429 		__sync_fetch_and_add(&ctx.count, 1);
1430 
1431 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1432 	EXPECT_EQ(ctx.count, 2);
1433 
1434 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1435 		pthread_kill(emitter, SIGUSR1);
1436 		pthread_join(emitter, NULL);
1437 	}
1438 
1439 	close(ctx.efd[0]);
1440 	close(ctx.sfd[0]);
1441 	close(ctx.sfd[1]);
1442 }
1443 
1444 /*
1445  *        t0    t1
1446  *     (ew) \  / (p)
1447  *           e0
1448  *            | (lt)
1449  *           e1
1450  *            | (et)
1451  *           s0
1452  */
TEST(epoll30)1453 TEST(epoll30)
1454 {
1455 	pthread_t emitter;
1456 	struct epoll_event e;
1457 	struct epoll_mtcontext ctx = { 0 };
1458 
1459 	signal(SIGUSR1, signal_handler);
1460 
1461 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1462 
1463 	ctx.efd[0] = epoll_create(1);
1464 	ASSERT_GE(ctx.efd[0], 0);
1465 
1466 	ctx.efd[1] = epoll_create(1);
1467 	ASSERT_GE(ctx.efd[1], 0);
1468 
1469 	e.events = EPOLLIN | EPOLLET;
1470 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1471 
1472 	e.events = EPOLLIN;
1473 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1474 
1475 	ctx.main = pthread_self();
1476 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
1477 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1478 
1479 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1480 		__sync_fetch_and_add(&ctx.count, 1);
1481 
1482 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1483 	EXPECT_EQ(ctx.count, 2);
1484 
1485 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1486 		pthread_kill(emitter, SIGUSR1);
1487 		pthread_join(emitter, NULL);
1488 	}
1489 
1490 	close(ctx.efd[0]);
1491 	close(ctx.sfd[0]);
1492 	close(ctx.sfd[1]);
1493 }
1494 
1495 /*
1496  *        t0    t1
1497  *     (ew) \  / (p)
1498  *           e0
1499  *            | (et)
1500  *           e1
1501  *            | (lt)
1502  *           s0
1503  */
TEST(epoll31)1504 TEST(epoll31)
1505 {
1506 	pthread_t emitter;
1507 	struct epoll_event e;
1508 	struct epoll_mtcontext ctx = { 0 };
1509 
1510 	signal(SIGUSR1, signal_handler);
1511 
1512 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1513 
1514 	ctx.efd[0] = epoll_create(1);
1515 	ASSERT_GE(ctx.efd[0], 0);
1516 
1517 	ctx.efd[1] = epoll_create(1);
1518 	ASSERT_GE(ctx.efd[1], 0);
1519 
1520 	e.events = EPOLLIN;
1521 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1522 
1523 	e.events = EPOLLIN | EPOLLET;
1524 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1525 
1526 	ctx.main = pthread_self();
1527 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
1528 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1529 
1530 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1531 		__sync_fetch_and_add(&ctx.count, 1);
1532 
1533 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1534 	EXPECT_EQ(ctx.count, 1);
1535 
1536 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1537 		pthread_kill(emitter, SIGUSR1);
1538 		pthread_join(emitter, NULL);
1539 	}
1540 
1541 	close(ctx.efd[0]);
1542 	close(ctx.sfd[0]);
1543 	close(ctx.sfd[1]);
1544 }
1545 
1546 /*
1547  *        t0    t1
1548  *     (ew) \  / (p)
1549  *           e0
1550  *            | (et)
1551  *           e1
1552  *            | (et)
1553  *           s0
1554  */
TEST(epoll32)1555 TEST(epoll32)
1556 {
1557 	pthread_t emitter;
1558 	struct epoll_event e;
1559 	struct epoll_mtcontext ctx = { 0 };
1560 
1561 	signal(SIGUSR1, signal_handler);
1562 
1563 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1564 
1565 	ctx.efd[0] = epoll_create(1);
1566 	ASSERT_GE(ctx.efd[0], 0);
1567 
1568 	ctx.efd[1] = epoll_create(1);
1569 	ASSERT_GE(ctx.efd[1], 0);
1570 
1571 	e.events = EPOLLIN | EPOLLET;
1572 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1573 
1574 	e.events = EPOLLIN | EPOLLET;
1575 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1576 
1577 	ctx.main = pthread_self();
1578 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
1579 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1580 
1581 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
1582 		__sync_fetch_and_add(&ctx.count, 1);
1583 
1584 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1585 	EXPECT_EQ(ctx.count, 1);
1586 
1587 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1588 		pthread_kill(emitter, SIGUSR1);
1589 		pthread_join(emitter, NULL);
1590 	}
1591 
1592 	close(ctx.efd[0]);
1593 	close(ctx.sfd[0]);
1594 	close(ctx.sfd[1]);
1595 }
1596 
1597 /*
1598  *        t0   t1
1599  *    (ew) |    | (ew)
1600  *         |   e0
1601  *          \  / (lt)
1602  *           e1
1603  *            | (lt)
1604  *           s0
1605  */
TEST(epoll33)1606 TEST(epoll33)
1607 {
1608 	pthread_t emitter;
1609 	struct epoll_event e;
1610 	struct epoll_mtcontext ctx = { 0 };
1611 
1612 	signal(SIGUSR1, signal_handler);
1613 
1614 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1615 
1616 	ctx.efd[0] = epoll_create(1);
1617 	ASSERT_GE(ctx.efd[0], 0);
1618 
1619 	ctx.efd[1] = epoll_create(1);
1620 	ASSERT_GE(ctx.efd[1], 0);
1621 
1622 	e.events = EPOLLIN;
1623 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1624 
1625 	e.events = EPOLLIN;
1626 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1627 
1628 	ctx.main = pthread_self();
1629 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1630 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1631 
1632 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
1633 		__sync_fetch_and_add(&ctx.count, 1);
1634 
1635 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1636 	EXPECT_EQ(ctx.count, 2);
1637 
1638 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1639 		pthread_kill(emitter, SIGUSR1);
1640 		pthread_join(emitter, NULL);
1641 	}
1642 
1643 	close(ctx.efd[0]);
1644 	close(ctx.efd[1]);
1645 	close(ctx.sfd[0]);
1646 	close(ctx.sfd[1]);
1647 }
1648 
1649 /*
1650  *        t0   t1
1651  *    (ew) |    | (ew)
1652  *         |   e0
1653  *          \  / (lt)
1654  *           e1
1655  *            | (et)
1656  *           s0
1657  */
TEST(epoll34)1658 TEST(epoll34)
1659 {
1660 	pthread_t emitter;
1661 	struct epoll_event e;
1662 	struct epoll_mtcontext ctx = { 0 };
1663 
1664 	signal(SIGUSR1, signal_handler);
1665 
1666 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1667 
1668 	ctx.efd[0] = epoll_create(1);
1669 	ASSERT_GE(ctx.efd[0], 0);
1670 
1671 	ctx.efd[1] = epoll_create(1);
1672 	ASSERT_GE(ctx.efd[1], 0);
1673 
1674 	e.events = EPOLLIN | EPOLLET;
1675 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1676 
1677 	e.events = EPOLLIN;
1678 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1679 
1680 	ctx.main = pthread_self();
1681 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);
1682 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1683 
1684 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
1685 		__sync_fetch_and_or(&ctx.count, 2);
1686 
1687 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1688 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
1689 
1690 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1691 		pthread_kill(emitter, SIGUSR1);
1692 		pthread_join(emitter, NULL);
1693 	}
1694 
1695 	close(ctx.efd[0]);
1696 	close(ctx.efd[1]);
1697 	close(ctx.sfd[0]);
1698 	close(ctx.sfd[1]);
1699 }
1700 
1701 /*
1702  *        t0   t1
1703  *    (ew) |    | (ew)
1704  *         |   e0
1705  *          \  / (et)
1706  *           e1
1707  *            | (lt)
1708  *           s0
1709  */
TEST(epoll35)1710 TEST(epoll35)
1711 {
1712 	pthread_t emitter;
1713 	struct epoll_event e;
1714 	struct epoll_mtcontext ctx = { 0 };
1715 
1716 	signal(SIGUSR1, signal_handler);
1717 
1718 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1719 
1720 	ctx.efd[0] = epoll_create(1);
1721 	ASSERT_GE(ctx.efd[0], 0);
1722 
1723 	ctx.efd[1] = epoll_create(1);
1724 	ASSERT_GE(ctx.efd[1], 0);
1725 
1726 	e.events = EPOLLIN;
1727 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1728 
1729 	e.events = EPOLLIN | EPOLLET;
1730 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1731 
1732 	ctx.main = pthread_self();
1733 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1734 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1735 
1736 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
1737 		__sync_fetch_and_add(&ctx.count, 1);
1738 
1739 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1740 	EXPECT_EQ(ctx.count, 2);
1741 
1742 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1743 		pthread_kill(emitter, SIGUSR1);
1744 		pthread_join(emitter, NULL);
1745 	}
1746 
1747 	close(ctx.efd[0]);
1748 	close(ctx.efd[1]);
1749 	close(ctx.sfd[0]);
1750 	close(ctx.sfd[1]);
1751 }
1752 
1753 /*
1754  *        t0   t1
1755  *    (ew) |    | (ew)
1756  *         |   e0
1757  *          \  / (et)
1758  *           e1
1759  *            | (et)
1760  *           s0
1761  */
TEST(epoll36)1762 TEST(epoll36)
1763 {
1764 	pthread_t emitter;
1765 	struct epoll_event e;
1766 	struct epoll_mtcontext ctx = { 0 };
1767 
1768 	signal(SIGUSR1, signal_handler);
1769 
1770 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1771 
1772 	ctx.efd[0] = epoll_create(1);
1773 	ASSERT_GE(ctx.efd[0], 0);
1774 
1775 	ctx.efd[1] = epoll_create(1);
1776 	ASSERT_GE(ctx.efd[1], 0);
1777 
1778 	e.events = EPOLLIN | EPOLLET;
1779 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1780 
1781 	e.events = EPOLLIN | EPOLLET;
1782 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1783 
1784 	ctx.main = pthread_self();
1785 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);
1786 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1787 
1788 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
1789 		__sync_fetch_and_or(&ctx.count, 2);
1790 
1791 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1792 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
1793 
1794 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1795 		pthread_kill(emitter, SIGUSR1);
1796 		pthread_join(emitter, NULL);
1797 	}
1798 
1799 	close(ctx.efd[0]);
1800 	close(ctx.efd[1]);
1801 	close(ctx.sfd[0]);
1802 	close(ctx.sfd[1]);
1803 }
1804 
1805 /*
1806  *        t0   t1
1807  *     (p) |    | (ew)
1808  *         |   e0
1809  *          \  / (lt)
1810  *           e1
1811  *            | (lt)
1812  *           s0
1813  */
TEST(epoll37)1814 TEST(epoll37)
1815 {
1816 	pthread_t emitter;
1817 	struct pollfd pfd;
1818 	struct epoll_event e;
1819 	struct epoll_mtcontext ctx = { 0 };
1820 
1821 	signal(SIGUSR1, signal_handler);
1822 
1823 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1824 
1825 	ctx.efd[0] = epoll_create(1);
1826 	ASSERT_GE(ctx.efd[0], 0);
1827 
1828 	ctx.efd[1] = epoll_create(1);
1829 	ASSERT_GE(ctx.efd[1], 0);
1830 
1831 	e.events = EPOLLIN;
1832 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1833 
1834 	e.events = EPOLLIN;
1835 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1836 
1837 	ctx.main = pthread_self();
1838 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1839 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1840 
1841 	pfd.fd = ctx.efd[1];
1842 	pfd.events = POLLIN;
1843 	if (poll(&pfd, 1, -1) > 0) {
1844 		if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)
1845 			__sync_fetch_and_add(&ctx.count, 1);
1846 	}
1847 
1848 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1849 	EXPECT_EQ(ctx.count, 2);
1850 
1851 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1852 		pthread_kill(emitter, SIGUSR1);
1853 		pthread_join(emitter, NULL);
1854 	}
1855 
1856 	close(ctx.efd[0]);
1857 	close(ctx.efd[1]);
1858 	close(ctx.sfd[0]);
1859 	close(ctx.sfd[1]);
1860 }
1861 
1862 /*
1863  *        t0   t1
1864  *     (p) |    | (ew)
1865  *         |   e0
1866  *          \  / (lt)
1867  *           e1
1868  *            | (et)
1869  *           s0
1870  */
TEST(epoll38)1871 TEST(epoll38)
1872 {
1873 	pthread_t emitter;
1874 	struct pollfd pfd;
1875 	struct epoll_event e;
1876 	struct epoll_mtcontext ctx = { 0 };
1877 
1878 	signal(SIGUSR1, signal_handler);
1879 
1880 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1881 
1882 	ctx.efd[0] = epoll_create(1);
1883 	ASSERT_GE(ctx.efd[0], 0);
1884 
1885 	ctx.efd[1] = epoll_create(1);
1886 	ASSERT_GE(ctx.efd[1], 0);
1887 
1888 	e.events = EPOLLIN | EPOLLET;
1889 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1890 
1891 	e.events = EPOLLIN;
1892 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1893 
1894 	ctx.main = pthread_self();
1895 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);
1896 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1897 
1898 	pfd.fd = ctx.efd[1];
1899 	pfd.events = POLLIN;
1900 	if (poll(&pfd, 1, -1) > 0) {
1901 		if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)
1902 			__sync_fetch_and_or(&ctx.count, 2);
1903 	}
1904 
1905 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1906 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
1907 
1908 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1909 		pthread_kill(emitter, SIGUSR1);
1910 		pthread_join(emitter, NULL);
1911 	}
1912 
1913 	close(ctx.efd[0]);
1914 	close(ctx.efd[1]);
1915 	close(ctx.sfd[0]);
1916 	close(ctx.sfd[1]);
1917 }
1918 
1919 /*
1920  *        t0   t1
1921  *     (p) |    | (ew)
1922  *         |   e0
1923  *          \  / (et)
1924  *           e1
1925  *            | (lt)
1926  *           s0
1927  */
TEST(epoll39)1928 TEST(epoll39)
1929 {
1930 	pthread_t emitter;
1931 	struct pollfd pfd;
1932 	struct epoll_event e;
1933 	struct epoll_mtcontext ctx = { 0 };
1934 
1935 	signal(SIGUSR1, signal_handler);
1936 
1937 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1938 
1939 	ctx.efd[0] = epoll_create(1);
1940 	ASSERT_GE(ctx.efd[0], 0);
1941 
1942 	ctx.efd[1] = epoll_create(1);
1943 	ASSERT_GE(ctx.efd[1], 0);
1944 
1945 	e.events = EPOLLIN;
1946 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
1947 
1948 	e.events = EPOLLIN | EPOLLET;
1949 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
1950 
1951 	ctx.main = pthread_self();
1952 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
1953 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
1954 
1955 	pfd.fd = ctx.efd[1];
1956 	pfd.events = POLLIN;
1957 	if (poll(&pfd, 1, -1) > 0) {
1958 		if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)
1959 			__sync_fetch_and_add(&ctx.count, 1);
1960 	}
1961 
1962 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
1963 	EXPECT_EQ(ctx.count, 2);
1964 
1965 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
1966 		pthread_kill(emitter, SIGUSR1);
1967 		pthread_join(emitter, NULL);
1968 	}
1969 
1970 	close(ctx.efd[0]);
1971 	close(ctx.efd[1]);
1972 	close(ctx.sfd[0]);
1973 	close(ctx.sfd[1]);
1974 }
1975 
1976 /*
1977  *        t0   t1
1978  *     (p) |    | (ew)
1979  *         |   e0
1980  *          \  / (et)
1981  *           e1
1982  *            | (et)
1983  *           s0
1984  */
TEST(epoll40)1985 TEST(epoll40)
1986 {
1987 	pthread_t emitter;
1988 	struct pollfd pfd;
1989 	struct epoll_event e;
1990 	struct epoll_mtcontext ctx = { 0 };
1991 
1992 	signal(SIGUSR1, signal_handler);
1993 
1994 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
1995 
1996 	ctx.efd[0] = epoll_create(1);
1997 	ASSERT_GE(ctx.efd[0], 0);
1998 
1999 	ctx.efd[1] = epoll_create(1);
2000 	ASSERT_GE(ctx.efd[1], 0);
2001 
2002 	e.events = EPOLLIN | EPOLLET;
2003 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2004 
2005 	e.events = EPOLLIN | EPOLLET;
2006 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2007 
2008 	ctx.main = pthread_self();
2009 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);
2010 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2011 
2012 	pfd.fd = ctx.efd[1];
2013 	pfd.events = POLLIN;
2014 	if (poll(&pfd, 1, -1) > 0) {
2015 		if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)
2016 			__sync_fetch_and_or(&ctx.count, 2);
2017 	}
2018 
2019 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2020 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
2021 
2022 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2023 		pthread_kill(emitter, SIGUSR1);
2024 		pthread_join(emitter, NULL);
2025 	}
2026 
2027 	close(ctx.efd[0]);
2028 	close(ctx.efd[1]);
2029 	close(ctx.sfd[0]);
2030 	close(ctx.sfd[1]);
2031 }
2032 
2033 /*
2034  *        t0   t1
2035  *    (ew) |    | (p)
2036  *         |   e0
2037  *          \  / (lt)
2038  *           e1
2039  *            | (lt)
2040  *           s0
2041  */
TEST(epoll41)2042 TEST(epoll41)
2043 {
2044 	pthread_t emitter;
2045 	struct epoll_event e;
2046 	struct epoll_mtcontext ctx = { 0 };
2047 
2048 	signal(SIGUSR1, signal_handler);
2049 
2050 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2051 
2052 	ctx.efd[0] = epoll_create(1);
2053 	ASSERT_GE(ctx.efd[0], 0);
2054 
2055 	ctx.efd[1] = epoll_create(1);
2056 	ASSERT_GE(ctx.efd[1], 0);
2057 
2058 	e.events = EPOLLIN;
2059 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2060 
2061 	e.events = EPOLLIN;
2062 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2063 
2064 	ctx.main = pthread_self();
2065 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2066 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2067 
2068 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
2069 		__sync_fetch_and_add(&ctx.count, 1);
2070 
2071 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2072 	EXPECT_EQ(ctx.count, 2);
2073 
2074 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2075 		pthread_kill(emitter, SIGUSR1);
2076 		pthread_join(emitter, NULL);
2077 	}
2078 
2079 	close(ctx.efd[0]);
2080 	close(ctx.efd[1]);
2081 	close(ctx.sfd[0]);
2082 	close(ctx.sfd[1]);
2083 }
2084 
2085 /*
2086  *        t0   t1
2087  *    (ew) |    | (p)
2088  *         |   e0
2089  *          \  / (lt)
2090  *           e1
2091  *            | (et)
2092  *           s0
2093  */
TEST(epoll42)2094 TEST(epoll42)
2095 {
2096 	pthread_t emitter;
2097 	struct epoll_event e;
2098 	struct epoll_mtcontext ctx = { 0 };
2099 
2100 	signal(SIGUSR1, signal_handler);
2101 
2102 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2103 
2104 	ctx.efd[0] = epoll_create(1);
2105 	ASSERT_GE(ctx.efd[0], 0);
2106 
2107 	ctx.efd[1] = epoll_create(1);
2108 	ASSERT_GE(ctx.efd[1], 0);
2109 
2110 	e.events = EPOLLIN | EPOLLET;
2111 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2112 
2113 	e.events = EPOLLIN;
2114 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2115 
2116 	ctx.main = pthread_self();
2117 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);
2118 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2119 
2120 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
2121 		__sync_fetch_and_or(&ctx.count, 2);
2122 
2123 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2124 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
2125 
2126 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2127 		pthread_kill(emitter, SIGUSR1);
2128 		pthread_join(emitter, NULL);
2129 	}
2130 
2131 	close(ctx.efd[0]);
2132 	close(ctx.efd[1]);
2133 	close(ctx.sfd[0]);
2134 	close(ctx.sfd[1]);
2135 }
2136 
2137 /*
2138  *        t0   t1
2139  *    (ew) |    | (p)
2140  *         |   e0
2141  *          \  / (et)
2142  *           e1
2143  *            | (lt)
2144  *           s0
2145  */
TEST(epoll43)2146 TEST(epoll43)
2147 {
2148 	pthread_t emitter;
2149 	struct epoll_event e;
2150 	struct epoll_mtcontext ctx = { 0 };
2151 
2152 	signal(SIGUSR1, signal_handler);
2153 
2154 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2155 
2156 	ctx.efd[0] = epoll_create(1);
2157 	ASSERT_GE(ctx.efd[0], 0);
2158 
2159 	ctx.efd[1] = epoll_create(1);
2160 	ASSERT_GE(ctx.efd[1], 0);
2161 
2162 	e.events = EPOLLIN;
2163 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2164 
2165 	e.events = EPOLLIN | EPOLLET;
2166 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2167 
2168 	ctx.main = pthread_self();
2169 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2170 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2171 
2172 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
2173 		__sync_fetch_and_add(&ctx.count, 1);
2174 
2175 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2176 	EXPECT_EQ(ctx.count, 2);
2177 
2178 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2179 		pthread_kill(emitter, SIGUSR1);
2180 		pthread_join(emitter, NULL);
2181 	}
2182 
2183 	close(ctx.efd[0]);
2184 	close(ctx.efd[1]);
2185 	close(ctx.sfd[0]);
2186 	close(ctx.sfd[1]);
2187 }
2188 
2189 /*
2190  *        t0   t1
2191  *    (ew) |    | (p)
2192  *         |   e0
2193  *          \  / (et)
2194  *           e1
2195  *            | (et)
2196  *           s0
2197  */
TEST(epoll44)2198 TEST(epoll44)
2199 {
2200 	pthread_t emitter;
2201 	struct epoll_event e;
2202 	struct epoll_mtcontext ctx = { 0 };
2203 
2204 	signal(SIGUSR1, signal_handler);
2205 
2206 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2207 
2208 	ctx.efd[0] = epoll_create(1);
2209 	ASSERT_GE(ctx.efd[0], 0);
2210 
2211 	ctx.efd[1] = epoll_create(1);
2212 	ASSERT_GE(ctx.efd[1], 0);
2213 
2214 	e.events = EPOLLIN | EPOLLET;
2215 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2216 
2217 	e.events = EPOLLIN | EPOLLET;
2218 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2219 
2220 	ctx.main = pthread_self();
2221 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);
2222 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2223 
2224 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
2225 		__sync_fetch_and_or(&ctx.count, 2);
2226 
2227 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2228 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
2229 
2230 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2231 		pthread_kill(emitter, SIGUSR1);
2232 		pthread_join(emitter, NULL);
2233 	}
2234 
2235 	close(ctx.efd[0]);
2236 	close(ctx.efd[1]);
2237 	close(ctx.sfd[0]);
2238 	close(ctx.sfd[1]);
2239 }
2240 
2241 /*
2242  *        t0   t1
2243  *     (p) |    | (p)
2244  *         |   e0
2245  *          \  / (lt)
2246  *           e1
2247  *            | (lt)
2248  *           s0
2249  */
TEST(epoll45)2250 TEST(epoll45)
2251 {
2252 	pthread_t emitter;
2253 	struct pollfd pfd;
2254 	struct epoll_event e;
2255 	struct epoll_mtcontext ctx = { 0 };
2256 
2257 	signal(SIGUSR1, signal_handler);
2258 
2259 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2260 
2261 	ctx.efd[0] = epoll_create(1);
2262 	ASSERT_GE(ctx.efd[0], 0);
2263 
2264 	ctx.efd[1] = epoll_create(1);
2265 	ASSERT_GE(ctx.efd[1], 0);
2266 
2267 	e.events = EPOLLIN;
2268 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2269 
2270 	e.events = EPOLLIN;
2271 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2272 
2273 	ctx.main = pthread_self();
2274 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2275 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2276 
2277 	pfd.fd = ctx.efd[1];
2278 	pfd.events = POLLIN;
2279 	if (poll(&pfd, 1, -1) > 0) {
2280 		if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)
2281 			__sync_fetch_and_add(&ctx.count, 1);
2282 	}
2283 
2284 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2285 	EXPECT_EQ(ctx.count, 2);
2286 
2287 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2288 		pthread_kill(emitter, SIGUSR1);
2289 		pthread_join(emitter, NULL);
2290 	}
2291 
2292 	close(ctx.efd[0]);
2293 	close(ctx.efd[1]);
2294 	close(ctx.sfd[0]);
2295 	close(ctx.sfd[1]);
2296 }
2297 
2298 /*
2299  *        t0   t1
2300  *     (p) |    | (p)
2301  *         |   e0
2302  *          \  / (lt)
2303  *           e1
2304  *            | (et)
2305  *           s0
2306  */
TEST(epoll46)2307 TEST(epoll46)
2308 {
2309 	pthread_t emitter;
2310 	struct epoll_event e;
2311 	struct epoll_mtcontext ctx = { 0 };
2312 
2313 	signal(SIGUSR1, signal_handler);
2314 
2315 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2316 
2317 	ctx.efd[0] = epoll_create(1);
2318 	ASSERT_GE(ctx.efd[0], 0);
2319 
2320 	ctx.efd[1] = epoll_create(1);
2321 	ASSERT_GE(ctx.efd[1], 0);
2322 
2323 	e.events = EPOLLIN | EPOLLET;
2324 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2325 
2326 	e.events = EPOLLIN;
2327 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2328 
2329 	ctx.main = pthread_self();
2330 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);
2331 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2332 
2333 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
2334 		__sync_fetch_and_or(&ctx.count, 2);
2335 
2336 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2337 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
2338 
2339 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2340 		pthread_kill(emitter, SIGUSR1);
2341 		pthread_join(emitter, NULL);
2342 	}
2343 
2344 	close(ctx.efd[0]);
2345 	close(ctx.efd[1]);
2346 	close(ctx.sfd[0]);
2347 	close(ctx.sfd[1]);
2348 }
2349 
2350 /*
2351  *        t0   t1
2352  *     (p) |    | (p)
2353  *         |   e0
2354  *          \  / (et)
2355  *           e1
2356  *            | (lt)
2357  *           s0
2358  */
TEST(epoll47)2359 TEST(epoll47)
2360 {
2361 	pthread_t emitter;
2362 	struct pollfd pfd;
2363 	struct epoll_event e;
2364 	struct epoll_mtcontext ctx = { 0 };
2365 
2366 	signal(SIGUSR1, signal_handler);
2367 
2368 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2369 
2370 	ctx.efd[0] = epoll_create(1);
2371 	ASSERT_GE(ctx.efd[0], 0);
2372 
2373 	ctx.efd[1] = epoll_create(1);
2374 	ASSERT_GE(ctx.efd[1], 0);
2375 
2376 	e.events = EPOLLIN;
2377 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2378 
2379 	e.events = EPOLLIN | EPOLLET;
2380 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2381 
2382 	ctx.main = pthread_self();
2383 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2384 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2385 
2386 	pfd.fd = ctx.efd[1];
2387 	pfd.events = POLLIN;
2388 	if (poll(&pfd, 1, -1) > 0) {
2389 		if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)
2390 			__sync_fetch_and_add(&ctx.count, 1);
2391 	}
2392 
2393 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2394 	EXPECT_EQ(ctx.count, 2);
2395 
2396 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2397 		pthread_kill(emitter, SIGUSR1);
2398 		pthread_join(emitter, NULL);
2399 	}
2400 
2401 	close(ctx.efd[0]);
2402 	close(ctx.efd[1]);
2403 	close(ctx.sfd[0]);
2404 	close(ctx.sfd[1]);
2405 }
2406 
2407 /*
2408  *        t0   t1
2409  *     (p) |    | (p)
2410  *         |   e0
2411  *          \  / (et)
2412  *           e1
2413  *            | (et)
2414  *           s0
2415  */
TEST(epoll48)2416 TEST(epoll48)
2417 {
2418 	pthread_t emitter;
2419 	struct epoll_event e;
2420 	struct epoll_mtcontext ctx = { 0 };
2421 
2422 	signal(SIGUSR1, signal_handler);
2423 
2424 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
2425 
2426 	ctx.efd[0] = epoll_create(1);
2427 	ASSERT_GE(ctx.efd[0], 0);
2428 
2429 	ctx.efd[1] = epoll_create(1);
2430 	ASSERT_GE(ctx.efd[1], 0);
2431 
2432 	e.events = EPOLLIN | EPOLLET;
2433 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2434 
2435 	e.events = EPOLLIN | EPOLLET;
2436 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2437 
2438 	ctx.main = pthread_self();
2439 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);
2440 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);
2441 
2442 	if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)
2443 		__sync_fetch_and_or(&ctx.count, 2);
2444 
2445 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2446 	EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));
2447 
2448 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2449 		pthread_kill(emitter, SIGUSR1);
2450 		pthread_join(emitter, NULL);
2451 	}
2452 
2453 	close(ctx.efd[0]);
2454 	close(ctx.efd[1]);
2455 	close(ctx.sfd[0]);
2456 	close(ctx.sfd[1]);
2457 }
2458 
2459 /*
2460  *           t0
2461  *            | (ew)
2462  *           e0
2463  *     (lt) /  \ (lt)
2464  *        e1    e2
2465  *    (lt) |     | (lt)
2466  *        s0    s2
2467  */
TEST(epoll49)2468 TEST(epoll49)
2469 {
2470 	int efd[3];
2471 	int sfd[4];
2472 	struct epoll_event events[2];
2473 
2474 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
2475 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
2476 
2477 	efd[0] = epoll_create(1);
2478 	ASSERT_GE(efd[0], 0);
2479 
2480 	efd[1] = epoll_create(1);
2481 	ASSERT_GE(efd[1], 0);
2482 
2483 	efd[2] = epoll_create(1);
2484 	ASSERT_GE(efd[2], 0);
2485 
2486 	events[0].events = EPOLLIN;
2487 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);
2488 
2489 	events[0].events = EPOLLIN;
2490 	ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);
2491 
2492 	events[0].events = EPOLLIN;
2493 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);
2494 
2495 	events[0].events = EPOLLIN;
2496 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);
2497 
2498 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
2499 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
2500 
2501 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);
2502 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);
2503 
2504 	close(efd[0]);
2505 	close(efd[1]);
2506 	close(efd[2]);
2507 	close(sfd[0]);
2508 	close(sfd[1]);
2509 	close(sfd[2]);
2510 	close(sfd[3]);
2511 }
2512 
2513 /*
2514  *           t0
2515  *            | (ew)
2516  *           e0
2517  *     (et) /  \ (et)
2518  *        e1    e2
2519  *    (lt) |     | (lt)
2520  *        s0    s2
2521  */
TEST(epoll50)2522 TEST(epoll50)
2523 {
2524 	int efd[3];
2525 	int sfd[4];
2526 	struct epoll_event events[2];
2527 
2528 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
2529 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
2530 
2531 	efd[0] = epoll_create(1);
2532 	ASSERT_GE(efd[0], 0);
2533 
2534 	efd[1] = epoll_create(1);
2535 	ASSERT_GE(efd[1], 0);
2536 
2537 	efd[2] = epoll_create(1);
2538 	ASSERT_GE(efd[2], 0);
2539 
2540 	events[0].events = EPOLLIN;
2541 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);
2542 
2543 	events[0].events = EPOLLIN;
2544 	ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);
2545 
2546 	events[0].events = EPOLLIN | EPOLLET;
2547 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);
2548 
2549 	events[0].events = EPOLLIN | EPOLLET;
2550 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);
2551 
2552 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
2553 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
2554 
2555 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);
2556 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 0);
2557 
2558 	close(efd[0]);
2559 	close(efd[1]);
2560 	close(efd[2]);
2561 	close(sfd[0]);
2562 	close(sfd[1]);
2563 	close(sfd[2]);
2564 	close(sfd[3]);
2565 }
2566 
2567 /*
2568  *           t0
2569  *            | (p)
2570  *           e0
2571  *     (lt) /  \ (lt)
2572  *        e1    e2
2573  *    (lt) |     | (lt)
2574  *        s0    s2
2575  */
TEST(epoll51)2576 TEST(epoll51)
2577 {
2578 	int efd[3];
2579 	int sfd[4];
2580 	struct pollfd pfd;
2581 	struct epoll_event events[2];
2582 
2583 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
2584 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
2585 
2586 	efd[0] = epoll_create(1);
2587 	ASSERT_GE(efd[0], 0);
2588 
2589 	efd[1] = epoll_create(1);
2590 	ASSERT_GE(efd[1], 0);
2591 
2592 	efd[2] = epoll_create(1);
2593 	ASSERT_GE(efd[2], 0);
2594 
2595 	events[0].events = EPOLLIN;
2596 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);
2597 
2598 	events[0].events = EPOLLIN;
2599 	ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);
2600 
2601 	events[0].events = EPOLLIN;
2602 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);
2603 
2604 	events[0].events = EPOLLIN;
2605 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);
2606 
2607 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
2608 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
2609 
2610 	pfd.fd = efd[0];
2611 	pfd.events = POLLIN;
2612 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
2613 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);
2614 
2615 	pfd.fd = efd[0];
2616 	pfd.events = POLLIN;
2617 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
2618 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);
2619 
2620 	close(efd[0]);
2621 	close(efd[1]);
2622 	close(efd[2]);
2623 	close(sfd[0]);
2624 	close(sfd[1]);
2625 	close(sfd[2]);
2626 	close(sfd[3]);
2627 }
2628 
2629 /*
2630  *           t0
2631  *            | (p)
2632  *           e0
2633  *     (et) /  \ (et)
2634  *        e1    e2
2635  *    (lt) |     | (lt)
2636  *        s0    s2
2637  */
TEST(epoll52)2638 TEST(epoll52)
2639 {
2640 	int efd[3];
2641 	int sfd[4];
2642 	struct pollfd pfd;
2643 	struct epoll_event events[2];
2644 
2645 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);
2646 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);
2647 
2648 	efd[0] = epoll_create(1);
2649 	ASSERT_GE(efd[0], 0);
2650 
2651 	efd[1] = epoll_create(1);
2652 	ASSERT_GE(efd[1], 0);
2653 
2654 	efd[2] = epoll_create(1);
2655 	ASSERT_GE(efd[2], 0);
2656 
2657 	events[0].events = EPOLLIN;
2658 	ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);
2659 
2660 	events[0].events = EPOLLIN;
2661 	ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);
2662 
2663 	events[0].events = EPOLLIN | EPOLLET;
2664 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);
2665 
2666 	events[0].events = EPOLLIN | EPOLLET;
2667 	ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);
2668 
2669 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
2670 	ASSERT_EQ(write(sfd[3], "w", 1), 1);
2671 
2672 	pfd.fd = efd[0];
2673 	pfd.events = POLLIN;
2674 	EXPECT_EQ(poll(&pfd, 1, 0), 1);
2675 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);
2676 
2677 	pfd.fd = efd[0];
2678 	pfd.events = POLLIN;
2679 	EXPECT_EQ(poll(&pfd, 1, 0), 0);
2680 	EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 0);
2681 
2682 	close(efd[0]);
2683 	close(efd[1]);
2684 	close(efd[2]);
2685 	close(sfd[0]);
2686 	close(sfd[1]);
2687 	close(sfd[2]);
2688 	close(sfd[3]);
2689 }
2690 
2691 /*
2692  *        t0    t1
2693  *     (ew) \  / (ew)
2694  *           e0
2695  *     (lt) /  \ (lt)
2696  *        e1    e2
2697  *    (lt) |     | (lt)
2698  *        s0    s2
2699  */
TEST(epoll53)2700 TEST(epoll53)
2701 {
2702 	pthread_t emitter;
2703 	struct epoll_event e;
2704 	struct epoll_mtcontext ctx = { 0 };
2705 
2706 	signal(SIGUSR1, signal_handler);
2707 
2708 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
2709 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
2710 
2711 	ctx.efd[0] = epoll_create(1);
2712 	ASSERT_GE(ctx.efd[0], 0);
2713 
2714 	ctx.efd[1] = epoll_create(1);
2715 	ASSERT_GE(ctx.efd[1], 0);
2716 
2717 	ctx.efd[2] = epoll_create(1);
2718 	ASSERT_GE(ctx.efd[2], 0);
2719 
2720 	e.events = EPOLLIN;
2721 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2722 
2723 	e.events = EPOLLIN;
2724 	ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);
2725 
2726 	e.events = EPOLLIN;
2727 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2728 
2729 	e.events = EPOLLIN;
2730 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);
2731 
2732 	ctx.main = pthread_self();
2733 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
2734 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
2735 
2736 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
2737 		__sync_fetch_and_add(&ctx.count, 1);
2738 
2739 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2740 	EXPECT_EQ(ctx.count, 2);
2741 
2742 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2743 		pthread_kill(emitter, SIGUSR1);
2744 		pthread_join(emitter, NULL);
2745 	}
2746 
2747 	close(ctx.efd[0]);
2748 	close(ctx.efd[1]);
2749 	close(ctx.efd[2]);
2750 	close(ctx.sfd[0]);
2751 	close(ctx.sfd[1]);
2752 	close(ctx.sfd[2]);
2753 	close(ctx.sfd[3]);
2754 }
2755 
2756 /*
2757  *        t0    t1
2758  *     (ew) \  / (ew)
2759  *           e0
2760  *     (et) /  \ (et)
2761  *        e1    e2
2762  *    (lt) |     | (lt)
2763  *        s0    s2
2764  */
TEST(epoll54)2765 TEST(epoll54)
2766 {
2767 	pthread_t emitter;
2768 	struct epoll_event e;
2769 	struct epoll_mtcontext ctx = { 0 };
2770 
2771 	signal(SIGUSR1, signal_handler);
2772 
2773 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
2774 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
2775 
2776 	ctx.efd[0] = epoll_create(1);
2777 	ASSERT_GE(ctx.efd[0], 0);
2778 
2779 	ctx.efd[1] = epoll_create(1);
2780 	ASSERT_GE(ctx.efd[1], 0);
2781 
2782 	ctx.efd[2] = epoll_create(1);
2783 	ASSERT_GE(ctx.efd[2], 0);
2784 
2785 	e.events = EPOLLIN;
2786 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2787 
2788 	e.events = EPOLLIN;
2789 	ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);
2790 
2791 	e.events = EPOLLIN | EPOLLET;
2792 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2793 
2794 	e.events = EPOLLIN | EPOLLET;
2795 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);
2796 
2797 	ctx.main = pthread_self();
2798 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);
2799 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
2800 
2801 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
2802 		__sync_fetch_and_add(&ctx.count, 1);
2803 
2804 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2805 	EXPECT_EQ(ctx.count, 2);
2806 
2807 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2808 		pthread_kill(emitter, SIGUSR1);
2809 		pthread_join(emitter, NULL);
2810 	}
2811 
2812 	close(ctx.efd[0]);
2813 	close(ctx.efd[1]);
2814 	close(ctx.efd[2]);
2815 	close(ctx.sfd[0]);
2816 	close(ctx.sfd[1]);
2817 	close(ctx.sfd[2]);
2818 	close(ctx.sfd[3]);
2819 }
2820 
2821 /*
2822  *        t0    t1
2823  *     (ew) \  / (p)
2824  *           e0
2825  *     (lt) /  \ (lt)
2826  *        e1    e2
2827  *    (lt) |     | (lt)
2828  *        s0    s2
2829  */
TEST(epoll55)2830 TEST(epoll55)
2831 {
2832 	pthread_t emitter;
2833 	struct epoll_event e;
2834 	struct epoll_mtcontext ctx = { 0 };
2835 
2836 	signal(SIGUSR1, signal_handler);
2837 
2838 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
2839 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
2840 
2841 	ctx.efd[0] = epoll_create(1);
2842 	ASSERT_GE(ctx.efd[0], 0);
2843 
2844 	ctx.efd[1] = epoll_create(1);
2845 	ASSERT_GE(ctx.efd[1], 0);
2846 
2847 	ctx.efd[2] = epoll_create(1);
2848 	ASSERT_GE(ctx.efd[2], 0);
2849 
2850 	e.events = EPOLLIN;
2851 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2852 
2853 	e.events = EPOLLIN;
2854 	ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);
2855 
2856 	e.events = EPOLLIN;
2857 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2858 
2859 	e.events = EPOLLIN;
2860 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);
2861 
2862 	ctx.main = pthread_self();
2863 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2864 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
2865 
2866 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
2867 		__sync_fetch_and_add(&ctx.count, 1);
2868 
2869 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2870 	EXPECT_EQ(ctx.count, 2);
2871 
2872 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2873 		pthread_kill(emitter, SIGUSR1);
2874 		pthread_join(emitter, NULL);
2875 	}
2876 
2877 	close(ctx.efd[0]);
2878 	close(ctx.efd[1]);
2879 	close(ctx.efd[2]);
2880 	close(ctx.sfd[0]);
2881 	close(ctx.sfd[1]);
2882 	close(ctx.sfd[2]);
2883 	close(ctx.sfd[3]);
2884 }
2885 
2886 /*
2887  *        t0    t1
2888  *     (ew) \  / (p)
2889  *           e0
2890  *     (et) /  \ (et)
2891  *        e1    e2
2892  *    (lt) |     | (lt)
2893  *        s0    s2
2894  */
TEST(epoll56)2895 TEST(epoll56)
2896 {
2897 	pthread_t emitter;
2898 	struct epoll_event e;
2899 	struct epoll_mtcontext ctx = { 0 };
2900 
2901 	signal(SIGUSR1, signal_handler);
2902 
2903 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
2904 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
2905 
2906 	ctx.efd[0] = epoll_create(1);
2907 	ASSERT_GE(ctx.efd[0], 0);
2908 
2909 	ctx.efd[1] = epoll_create(1);
2910 	ASSERT_GE(ctx.efd[1], 0);
2911 
2912 	ctx.efd[2] = epoll_create(1);
2913 	ASSERT_GE(ctx.efd[2], 0);
2914 
2915 	e.events = EPOLLIN;
2916 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2917 
2918 	e.events = EPOLLIN;
2919 	ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);
2920 
2921 	e.events = EPOLLIN | EPOLLET;
2922 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2923 
2924 	e.events = EPOLLIN | EPOLLET;
2925 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);
2926 
2927 	ctx.main = pthread_self();
2928 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2929 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
2930 
2931 	if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)
2932 		__sync_fetch_and_add(&ctx.count, 1);
2933 
2934 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
2935 	EXPECT_EQ(ctx.count, 2);
2936 
2937 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
2938 		pthread_kill(emitter, SIGUSR1);
2939 		pthread_join(emitter, NULL);
2940 	}
2941 
2942 	close(ctx.efd[0]);
2943 	close(ctx.efd[1]);
2944 	close(ctx.efd[2]);
2945 	close(ctx.sfd[0]);
2946 	close(ctx.sfd[1]);
2947 	close(ctx.sfd[2]);
2948 	close(ctx.sfd[3]);
2949 }
2950 
2951 /*
2952  *        t0    t1
2953  *      (p) \  / (p)
2954  *           e0
2955  *     (lt) /  \ (lt)
2956  *        e1    e2
2957  *    (lt) |     | (lt)
2958  *        s0    s2
2959  */
TEST(epoll57)2960 TEST(epoll57)
2961 {
2962 	pthread_t emitter;
2963 	struct pollfd pfd;
2964 	struct epoll_event e;
2965 	struct epoll_mtcontext ctx = { 0 };
2966 
2967 	signal(SIGUSR1, signal_handler);
2968 
2969 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
2970 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
2971 
2972 	ctx.efd[0] = epoll_create(1);
2973 	ASSERT_GE(ctx.efd[0], 0);
2974 
2975 	ctx.efd[1] = epoll_create(1);
2976 	ASSERT_GE(ctx.efd[1], 0);
2977 
2978 	ctx.efd[2] = epoll_create(1);
2979 	ASSERT_GE(ctx.efd[2], 0);
2980 
2981 	e.events = EPOLLIN;
2982 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
2983 
2984 	e.events = EPOLLIN;
2985 	ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);
2986 
2987 	e.events = EPOLLIN;
2988 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
2989 
2990 	e.events = EPOLLIN;
2991 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);
2992 
2993 	ctx.main = pthread_self();
2994 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
2995 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
2996 
2997 	pfd.fd = ctx.efd[0];
2998 	pfd.events = POLLIN;
2999 	if (poll(&pfd, 1, -1) > 0) {
3000 		if (epoll_wait(ctx.efd[0], &e, 1, 0) > 0)
3001 			__sync_fetch_and_add(&ctx.count, 1);
3002 	}
3003 
3004 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
3005 	EXPECT_EQ(ctx.count, 2);
3006 
3007 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
3008 		pthread_kill(emitter, SIGUSR1);
3009 		pthread_join(emitter, NULL);
3010 	}
3011 
3012 	close(ctx.efd[0]);
3013 	close(ctx.efd[1]);
3014 	close(ctx.efd[2]);
3015 	close(ctx.sfd[0]);
3016 	close(ctx.sfd[1]);
3017 	close(ctx.sfd[2]);
3018 	close(ctx.sfd[3]);
3019 }
3020 
3021 /*
3022  *        t0    t1
3023  *      (p) \  / (p)
3024  *           e0
3025  *     (et) /  \ (et)
3026  *        e1    e2
3027  *    (lt) |     | (lt)
3028  *        s0    s2
3029  */
TEST(epoll58)3030 TEST(epoll58)
3031 {
3032 	pthread_t emitter;
3033 	struct pollfd pfd;
3034 	struct epoll_event e;
3035 	struct epoll_mtcontext ctx = { 0 };
3036 
3037 	signal(SIGUSR1, signal_handler);
3038 
3039 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);
3040 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);
3041 
3042 	ctx.efd[0] = epoll_create(1);
3043 	ASSERT_GE(ctx.efd[0], 0);
3044 
3045 	ctx.efd[1] = epoll_create(1);
3046 	ASSERT_GE(ctx.efd[1], 0);
3047 
3048 	ctx.efd[2] = epoll_create(1);
3049 	ASSERT_GE(ctx.efd[2], 0);
3050 
3051 	e.events = EPOLLIN;
3052 	ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
3053 
3054 	e.events = EPOLLIN;
3055 	ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);
3056 
3057 	e.events = EPOLLIN | EPOLLET;
3058 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);
3059 
3060 	e.events = EPOLLIN | EPOLLET;
3061 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);
3062 
3063 	ctx.main = pthread_self();
3064 	ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);
3065 	ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);
3066 
3067 	pfd.fd = ctx.efd[0];
3068 	pfd.events = POLLIN;
3069 	if (poll(&pfd, 1, -1) > 0) {
3070 		if (epoll_wait(ctx.efd[0], &e, 1, 0) > 0)
3071 			__sync_fetch_and_add(&ctx.count, 1);
3072 	}
3073 
3074 	ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);
3075 	EXPECT_EQ(ctx.count, 2);
3076 
3077 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
3078 		pthread_kill(emitter, SIGUSR1);
3079 		pthread_join(emitter, NULL);
3080 	}
3081 
3082 	close(ctx.efd[0]);
3083 	close(ctx.efd[1]);
3084 	close(ctx.efd[2]);
3085 	close(ctx.sfd[0]);
3086 	close(ctx.sfd[1]);
3087 	close(ctx.sfd[2]);
3088 	close(ctx.sfd[3]);
3089 }
3090 
epoll59_thread(void * ctx_)3091 static void *epoll59_thread(void *ctx_)
3092 {
3093 	struct epoll_mtcontext *ctx = ctx_;
3094 	struct epoll_event e;
3095 	int i;
3096 
3097 	for (i = 0; i < 100000; i++) {
3098 		while (ctx->count == 0)
3099 			;
3100 
3101 		e.events = EPOLLIN | EPOLLERR | EPOLLET;
3102 		epoll_ctl(ctx->efd[0], EPOLL_CTL_MOD, ctx->sfd[0], &e);
3103 		ctx->count = 0;
3104 	}
3105 
3106 	return NULL;
3107 }
3108 
3109 /*
3110  *        t0
3111  *      (p) \
3112  *           e0
3113  *     (et) /
3114  *        e0
3115  *
3116  * Based on https://bugzilla.kernel.org/show_bug.cgi?id=205933
3117  */
TEST(epoll59)3118 TEST(epoll59)
3119 {
3120 	pthread_t emitter;
3121 	struct pollfd pfd;
3122 	struct epoll_event e;
3123 	struct epoll_mtcontext ctx = { 0 };
3124 	int i, ret;
3125 
3126 	signal(SIGUSR1, signal_handler);
3127 
3128 	ctx.efd[0] = epoll_create1(0);
3129 	ASSERT_GE(ctx.efd[0], 0);
3130 
3131 	ctx.sfd[0] = eventfd(1, 0);
3132 	ASSERT_GE(ctx.sfd[0], 0);
3133 
3134 	e.events = EPOLLIN | EPOLLERR | EPOLLET;
3135 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
3136 
3137 	ASSERT_EQ(pthread_create(&emitter, NULL, epoll59_thread, &ctx), 0);
3138 
3139 	for (i = 0; i < 100000; i++) {
3140 		ret = epoll_wait(ctx.efd[0], &e, 1, 1000);
3141 		ASSERT_GT(ret, 0);
3142 
3143 		while (ctx.count != 0)
3144 			;
3145 		ctx.count = 1;
3146 	}
3147 	if (pthread_tryjoin_np(emitter, NULL) < 0) {
3148 		pthread_kill(emitter, SIGUSR1);
3149 		pthread_join(emitter, NULL);
3150 	}
3151 	close(ctx.efd[0]);
3152 	close(ctx.sfd[0]);
3153 }
3154 
3155 enum {
3156 	EPOLL60_EVENTS_NR = 10,
3157 };
3158 
3159 struct epoll60_ctx {
3160 	volatile int stopped;
3161 	int ready;
3162 	int waiters;
3163 	int epfd;
3164 	int evfd[EPOLL60_EVENTS_NR];
3165 };
3166 
epoll60_wait_thread(void * ctx_)3167 static void *epoll60_wait_thread(void *ctx_)
3168 {
3169 	struct epoll60_ctx *ctx = ctx_;
3170 	struct epoll_event e;
3171 	sigset_t sigmask;
3172 	uint64_t v;
3173 	int ret;
3174 
3175 	/* Block SIGUSR1 */
3176 	sigemptyset(&sigmask);
3177 	sigaddset(&sigmask, SIGUSR1);
3178 	sigprocmask(SIG_SETMASK, &sigmask, NULL);
3179 
3180 	/* Prepare empty mask for epoll_pwait() */
3181 	sigemptyset(&sigmask);
3182 
3183 	while (!ctx->stopped) {
3184 		/* Mark we are ready */
3185 		__atomic_fetch_add(&ctx->ready, 1, __ATOMIC_ACQUIRE);
3186 
3187 		/* Start when all are ready */
3188 		while (__atomic_load_n(&ctx->ready, __ATOMIC_ACQUIRE) &&
3189 		       !ctx->stopped);
3190 
3191 		/* Account this waiter */
3192 		__atomic_fetch_add(&ctx->waiters, 1, __ATOMIC_ACQUIRE);
3193 
3194 		ret = epoll_pwait(ctx->epfd, &e, 1, 2000, &sigmask);
3195 		if (ret != 1) {
3196 			/* We expect only signal delivery on stop */
3197 			assert(ret < 0 && errno == EINTR && "Lost wakeup!\n");
3198 			assert(ctx->stopped);
3199 			break;
3200 		}
3201 
3202 		ret = read(e.data.fd, &v, sizeof(v));
3203 		/* Since we are on ET mode, thus each thread gets its own fd. */
3204 		assert(ret == sizeof(v));
3205 
3206 		__atomic_fetch_sub(&ctx->waiters, 1, __ATOMIC_RELEASE);
3207 	}
3208 
3209 	return NULL;
3210 }
3211 
msecs(void)3212 static inline unsigned long long msecs(void)
3213 {
3214 	struct timespec ts;
3215 	unsigned long long msecs;
3216 
3217 	clock_gettime(CLOCK_REALTIME, &ts);
3218 	msecs = ts.tv_sec * 1000ull;
3219 	msecs += ts.tv_nsec / 1000000ull;
3220 
3221 	return msecs;
3222 }
3223 
count_waiters(struct epoll60_ctx * ctx)3224 static inline int count_waiters(struct epoll60_ctx *ctx)
3225 {
3226 	return __atomic_load_n(&ctx->waiters, __ATOMIC_ACQUIRE);
3227 }
3228 
TEST(epoll60)3229 TEST(epoll60)
3230 {
3231 	struct epoll60_ctx ctx = { 0 };
3232 	pthread_t waiters[ARRAY_SIZE(ctx.evfd)];
3233 	struct epoll_event e;
3234 	int i, n, ret;
3235 
3236 	signal(SIGUSR1, signal_handler);
3237 
3238 	ctx.epfd = epoll_create1(0);
3239 	ASSERT_GE(ctx.epfd, 0);
3240 
3241 	/* Create event fds */
3242 	for (i = 0; i < ARRAY_SIZE(ctx.evfd); i++) {
3243 		ctx.evfd[i] = eventfd(0, EFD_NONBLOCK);
3244 		ASSERT_GE(ctx.evfd[i], 0);
3245 
3246 		e.events = EPOLLIN | EPOLLET;
3247 		e.data.fd = ctx.evfd[i];
3248 		ASSERT_EQ(epoll_ctl(ctx.epfd, EPOLL_CTL_ADD, ctx.evfd[i], &e), 0);
3249 	}
3250 
3251 	/* Create waiter threads */
3252 	for (i = 0; i < ARRAY_SIZE(waiters); i++)
3253 		ASSERT_EQ(pthread_create(&waiters[i], NULL,
3254 					 epoll60_wait_thread, &ctx), 0);
3255 
3256 	for (i = 0; i < 300; i++) {
3257 		uint64_t v = 1, ms;
3258 
3259 		/* Wait for all to be ready */
3260 		while (__atomic_load_n(&ctx.ready, __ATOMIC_ACQUIRE) !=
3261 		       ARRAY_SIZE(ctx.evfd))
3262 			;
3263 
3264 		/* Steady, go */
3265 		__atomic_fetch_sub(&ctx.ready, ARRAY_SIZE(ctx.evfd),
3266 				   __ATOMIC_ACQUIRE);
3267 
3268 		/* Wait all have gone to kernel */
3269 		while (count_waiters(&ctx) != ARRAY_SIZE(ctx.evfd))
3270 			;
3271 
3272 		/* 1ms should be enough to schedule away */
3273 		usleep(1000);
3274 
3275 		/* Quickly signal all handles at once */
3276 		for (n = 0; n < ARRAY_SIZE(ctx.evfd); n++) {
3277 			ret = write(ctx.evfd[n], &v, sizeof(v));
3278 			ASSERT_EQ(ret, sizeof(v));
3279 		}
3280 
3281 		/* Busy loop for 1s and wait for all waiters to wake up */
3282 		ms = msecs();
3283 		while (count_waiters(&ctx) && msecs() < ms + 1000)
3284 			;
3285 
3286 		ASSERT_EQ(count_waiters(&ctx), 0);
3287 	}
3288 	ctx.stopped = 1;
3289 	/* Stop waiters */
3290 	for (i = 0; i < ARRAY_SIZE(waiters); i++)
3291 		ret = pthread_kill(waiters[i], SIGUSR1);
3292 	for (i = 0; i < ARRAY_SIZE(waiters); i++)
3293 		pthread_join(waiters[i], NULL);
3294 
3295 	for (i = 0; i < ARRAY_SIZE(waiters); i++)
3296 		close(ctx.evfd[i]);
3297 	close(ctx.epfd);
3298 }
3299 
3300 struct epoll61_ctx {
3301 	int epfd;
3302 	int evfd;
3303 };
3304 
epoll61_write_eventfd(void * ctx_)3305 static void *epoll61_write_eventfd(void *ctx_)
3306 {
3307 	struct epoll61_ctx *ctx = ctx_;
3308 	int64_t l = 1;
3309 
3310 	usleep(10950);
3311 	write(ctx->evfd, &l, sizeof(l));
3312 	return NULL;
3313 }
3314 
epoll61_epoll_with_timeout(void * ctx_)3315 static void *epoll61_epoll_with_timeout(void *ctx_)
3316 {
3317 	struct epoll61_ctx *ctx = ctx_;
3318 	struct epoll_event events[1];
3319 	int n;
3320 
3321 	n = epoll_wait(ctx->epfd, events, 1, 11);
3322 	/*
3323 	 * If epoll returned the eventfd, write on the eventfd to wake up the
3324 	 * blocking poller.
3325 	 */
3326 	if (n == 1) {
3327 		int64_t l = 1;
3328 
3329 		write(ctx->evfd, &l, sizeof(l));
3330 	}
3331 	return NULL;
3332 }
3333 
epoll61_blocking_epoll(void * ctx_)3334 static void *epoll61_blocking_epoll(void *ctx_)
3335 {
3336 	struct epoll61_ctx *ctx = ctx_;
3337 	struct epoll_event events[1];
3338 
3339 	epoll_wait(ctx->epfd, events, 1, -1);
3340 	return NULL;
3341 }
3342 
TEST(epoll61)3343 TEST(epoll61)
3344 {
3345 	struct epoll61_ctx ctx;
3346 	struct epoll_event ev;
3347 	int i, r;
3348 
3349 	ctx.epfd = epoll_create1(0);
3350 	ASSERT_GE(ctx.epfd, 0);
3351 	ctx.evfd = eventfd(0, EFD_NONBLOCK);
3352 	ASSERT_GE(ctx.evfd, 0);
3353 
3354 	ev.events = EPOLLIN | EPOLLET | EPOLLERR | EPOLLHUP;
3355 	ev.data.ptr = NULL;
3356 	r = epoll_ctl(ctx.epfd, EPOLL_CTL_ADD, ctx.evfd, &ev);
3357 	ASSERT_EQ(r, 0);
3358 
3359 	/*
3360 	 * We are testing a race.  Repeat the test case 1000 times to make it
3361 	 * more likely to fail in case of a bug.
3362 	 */
3363 	for (i = 0; i < 1000; i++) {
3364 		pthread_t threads[3];
3365 		int n;
3366 
3367 		/*
3368 		 * Start 3 threads:
3369 		 * Thread 1 sleeps for 10.9ms and writes to the evenfd.
3370 		 * Thread 2 calls epoll with a timeout of 11ms.
3371 		 * Thread 3 calls epoll with a timeout of -1.
3372 		 *
3373 		 * The eventfd write by Thread 1 should either wakeup Thread 2
3374 		 * or Thread 3.  If it wakes up Thread 2, Thread 2 writes on the
3375 		 * eventfd to wake up Thread 3.
3376 		 *
3377 		 * If no events are missed, all three threads should eventually
3378 		 * be joinable.
3379 		 */
3380 		ASSERT_EQ(pthread_create(&threads[0], NULL,
3381 					 epoll61_write_eventfd, &ctx), 0);
3382 		ASSERT_EQ(pthread_create(&threads[1], NULL,
3383 					 epoll61_epoll_with_timeout, &ctx), 0);
3384 		ASSERT_EQ(pthread_create(&threads[2], NULL,
3385 					 epoll61_blocking_epoll, &ctx), 0);
3386 
3387 		for (n = 0; n < ARRAY_SIZE(threads); ++n)
3388 			ASSERT_EQ(pthread_join(threads[n], NULL), 0);
3389 	}
3390 
3391 	close(ctx.epfd);
3392 	close(ctx.evfd);
3393 }
3394 
3395 /* Equivalent to basic test epoll1, but exercising epoll_pwait2. */
TEST(epoll62)3396 TEST(epoll62)
3397 {
3398 	int efd;
3399 	int sfd[2];
3400 	struct epoll_event e;
3401 
3402 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
3403 
3404 	efd = epoll_create(1);
3405 	ASSERT_GE(efd, 0);
3406 
3407 	e.events = EPOLLIN;
3408 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);
3409 
3410 	ASSERT_EQ(write(sfd[1], "w", 1), 1);
3411 
3412 	EXPECT_EQ(sys_epoll_pwait2(efd, &e, 1, NULL, NULL, 0), 1);
3413 	EXPECT_EQ(sys_epoll_pwait2(efd, &e, 1, NULL, NULL, 0), 1);
3414 
3415 	close(efd);
3416 	close(sfd[0]);
3417 	close(sfd[1]);
3418 }
3419 
3420 /* Epoll_pwait2 basic timeout test. */
TEST(epoll63)3421 TEST(epoll63)
3422 {
3423 	const int cfg_delay_ms = 10;
3424 	unsigned long long tdiff;
3425 	struct __kernel_timespec ts;
3426 	int efd;
3427 	int sfd[2];
3428 	struct epoll_event e;
3429 
3430 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);
3431 
3432 	efd = epoll_create(1);
3433 	ASSERT_GE(efd, 0);
3434 
3435 	e.events = EPOLLIN;
3436 	ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);
3437 
3438 	ts.tv_sec = 0;
3439 	ts.tv_nsec = cfg_delay_ms * 1000 * 1000;
3440 
3441 	tdiff = msecs();
3442 	EXPECT_EQ(sys_epoll_pwait2(efd, &e, 1, &ts, NULL, 0), 0);
3443 	tdiff = msecs() - tdiff;
3444 
3445 	EXPECT_GE(tdiff, cfg_delay_ms);
3446 
3447 	close(efd);
3448 	close(sfd[0]);
3449 	close(sfd[1]);
3450 }
3451 
3452 /*
3453  *        t0    t1
3454  *     (ew) \  / (ew)
3455  *           e0
3456  *            | (lt)
3457  *           s0
3458  */
TEST(epoll64)3459 TEST(epoll64)
3460 {
3461 	pthread_t waiter[2];
3462 	struct epoll_event e;
3463 	struct epoll_mtcontext ctx = { 0 };
3464 
3465 	signal(SIGUSR1, signal_handler);
3466 
3467 	ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
3468 
3469 	ctx.efd[0] = epoll_create(1);
3470 	ASSERT_GE(ctx.efd[0], 0);
3471 
3472 	e.events = EPOLLIN;
3473 	ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
3474 
3475 	/*
3476 	 * main will act as the emitter once both waiter threads are
3477 	 * blocked and expects to both be awoken upon the ready event.
3478 	 */
3479 	ctx.main = pthread_self();
3480 	ASSERT_EQ(pthread_create(&waiter[0], NULL, waiter_entry1a, &ctx), 0);
3481 	ASSERT_EQ(pthread_create(&waiter[1], NULL, waiter_entry1a, &ctx), 0);
3482 
3483 	usleep(100000);
3484 	ASSERT_EQ(write(ctx.sfd[1], "w", 1), 1);
3485 
3486 	ASSERT_EQ(pthread_join(waiter[0], NULL), 0);
3487 	ASSERT_EQ(pthread_join(waiter[1], NULL), 0);
3488 
3489 	EXPECT_EQ(ctx.count, 2);
3490 
3491 	close(ctx.efd[0]);
3492 	close(ctx.sfd[0]);
3493 	close(ctx.sfd[1]);
3494 }
3495 
3496 TEST_HARNESS_MAIN
3497