]>
git.ipfire.org Git - thirdparty/linux.git/blob - tools/testing/selftests/filesystems/epoll/epoll_wakeup_test.c
1 // SPDX-License-Identifier: GPL-2.0
9 #include <sys/socket.h>
10 #include <sys/eventfd.h>
11 #include "../../kselftest_harness.h"
13 struct epoll_mtcontext
23 static void signal_handler(int signum
)
27 static void kill_timeout(struct epoll_mtcontext
*ctx
)
30 pthread_kill(ctx
->main
, SIGUSR1
);
31 pthread_kill(ctx
->waiter
, SIGUSR1
);
34 static void *waiter_entry1a(void *data
)
37 struct epoll_mtcontext
*ctx
= data
;
39 if (epoll_wait(ctx
->efd
[0], &e
, 1, -1) > 0)
40 __sync_fetch_and_add(&ctx
->count
, 1);
45 static void *waiter_entry1ap(void *data
)
49 struct epoll_mtcontext
*ctx
= data
;
53 if (poll(&pfd
, 1, -1) > 0) {
54 if (epoll_wait(ctx
->efd
[0], &e
, 1, 0) > 0)
55 __sync_fetch_and_add(&ctx
->count
, 1);
61 static void *waiter_entry1o(void *data
)
64 struct epoll_mtcontext
*ctx
= data
;
66 if (epoll_wait(ctx
->efd
[0], &e
, 1, -1) > 0)
67 __sync_fetch_and_or(&ctx
->count
, 1);
72 static void *waiter_entry1op(void *data
)
76 struct epoll_mtcontext
*ctx
= data
;
80 if (poll(&pfd
, 1, -1) > 0) {
81 if (epoll_wait(ctx
->efd
[0], &e
, 1, 0) > 0)
82 __sync_fetch_and_or(&ctx
->count
, 1);
88 static void *waiter_entry2a(void *data
)
90 struct epoll_event events
[2];
91 struct epoll_mtcontext
*ctx
= data
;
93 if (epoll_wait(ctx
->efd
[0], events
, 2, -1) > 0)
94 __sync_fetch_and_add(&ctx
->count
, 1);
99 static void *waiter_entry2ap(void *data
)
102 struct epoll_event events
[2];
103 struct epoll_mtcontext
*ctx
= data
;
105 pfd
.fd
= ctx
->efd
[0];
107 if (poll(&pfd
, 1, -1) > 0) {
108 if (epoll_wait(ctx
->efd
[0], events
, 2, 0) > 0)
109 __sync_fetch_and_add(&ctx
->count
, 1);
115 static void *emitter_entry1(void *data
)
117 struct epoll_mtcontext
*ctx
= data
;
120 write(ctx
->sfd
[1], "w", 1);
127 static void *emitter_entry2(void *data
)
129 struct epoll_mtcontext
*ctx
= data
;
132 write(ctx
->sfd
[1], "w", 1);
133 write(ctx
->sfd
[3], "w", 1);
151 struct epoll_event e
;
153 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
155 efd
= epoll_create(1);
159 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
161 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
163 EXPECT_EQ(epoll_wait(efd
, &e
, 1, 0), 1);
164 EXPECT_EQ(epoll_wait(efd
, &e
, 1, 0), 1);
182 struct epoll_event e
;
184 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
186 efd
= epoll_create(1);
189 e
.events
= EPOLLIN
| EPOLLET
;
190 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
192 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
194 EXPECT_EQ(epoll_wait(efd
, &e
, 1, 0), 1);
195 EXPECT_EQ(epoll_wait(efd
, &e
, 1, 0), 0);
213 struct epoll_event events
[2];
215 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
216 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
218 efd
= epoll_create(1);
221 events
[0].events
= EPOLLIN
;
222 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], events
), 0);
224 events
[0].events
= EPOLLIN
;
225 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[2], events
), 0);
227 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
228 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
230 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 2);
231 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 2);
251 struct epoll_event events
[2];
253 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
254 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
256 efd
= epoll_create(1);
259 events
[0].events
= EPOLLIN
| EPOLLET
;
260 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], events
), 0);
262 events
[0].events
= EPOLLIN
| EPOLLET
;
263 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[2], events
), 0);
265 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
266 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
268 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 2);
269 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 0);
290 struct epoll_event e
;
292 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
294 efd
= epoll_create(1);
298 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
300 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
304 ASSERT_EQ(poll(&pfd
, 1, 0), 1);
305 ASSERT_EQ(epoll_wait(efd
, &e
, 1, 0), 1);
309 ASSERT_EQ(poll(&pfd
, 1, 0), 1);
310 ASSERT_EQ(epoll_wait(efd
, &e
, 1, 0), 1);
329 struct epoll_event e
;
331 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
333 efd
= epoll_create(1);
336 e
.events
= EPOLLIN
| EPOLLET
;
337 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
339 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
343 ASSERT_EQ(poll(&pfd
, 1, 0), 1);
344 ASSERT_EQ(epoll_wait(efd
, &e
, 1, 0), 1);
348 ASSERT_EQ(poll(&pfd
, 1, 0), 0);
349 ASSERT_EQ(epoll_wait(efd
, &e
, 1, 0), 0);
369 struct epoll_event events
[2];
371 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
372 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
374 efd
= epoll_create(1);
377 events
[0].events
= EPOLLIN
;
378 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], events
), 0);
380 events
[0].events
= EPOLLIN
;
381 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[2], events
), 0);
383 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
384 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
388 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
389 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 2);
393 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
394 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 2);
415 struct epoll_event events
[2];
417 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
418 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
420 efd
= epoll_create(1);
423 events
[0].events
= EPOLLIN
| EPOLLET
;
424 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[0], events
), 0);
426 events
[0].events
= EPOLLIN
| EPOLLET
;
427 ASSERT_EQ(epoll_ctl(efd
, EPOLL_CTL_ADD
, sfd
[2], events
), 0);
429 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
430 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
434 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
435 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 2);
439 EXPECT_EQ(poll(&pfd
, 1, 0), 0);
440 EXPECT_EQ(epoll_wait(efd
, events
, 2, 0), 0);
459 struct epoll_event e
;
460 struct epoll_mtcontext ctx
= { 0 };
462 signal(SIGUSR1
, signal_handler
);
464 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
466 ctx
.efd
[0] = epoll_create(1);
467 ASSERT_GE(ctx
.efd
[0], 0);
470 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
472 ctx
.main
= pthread_self();
473 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
474 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
476 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
477 __sync_fetch_and_add(&ctx
.count
, 1);
479 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
480 EXPECT_EQ(ctx
.count
, 2);
482 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
483 pthread_kill(emitter
, SIGUSR1
);
484 pthread_join(emitter
, NULL
);
502 struct epoll_event e
;
503 struct epoll_mtcontext ctx
= { 0 };
505 signal(SIGUSR1
, signal_handler
);
507 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
509 ctx
.efd
[0] = epoll_create(1);
510 ASSERT_GE(ctx
.efd
[0], 0);
512 e
.events
= EPOLLIN
| EPOLLET
;
513 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
515 ctx
.main
= pthread_self();
516 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
517 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
519 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
520 __sync_fetch_and_add(&ctx
.count
, 1);
522 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
523 EXPECT_EQ(ctx
.count
, 1);
525 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
526 pthread_kill(emitter
, SIGUSR1
);
527 pthread_join(emitter
, NULL
);
545 struct epoll_event events
[2];
546 struct epoll_mtcontext ctx
= { 0 };
548 signal(SIGUSR1
, signal_handler
);
550 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
551 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
553 ctx
.efd
[0] = epoll_create(1);
554 ASSERT_GE(ctx
.efd
[0], 0);
556 events
[0].events
= EPOLLIN
;
557 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], events
), 0);
559 events
[0].events
= EPOLLIN
;
560 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[2], events
), 0);
562 ctx
.main
= pthread_self();
563 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry2a
, &ctx
), 0);
564 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
566 if (epoll_wait(ctx
.efd
[0], events
, 2, -1) > 0)
567 __sync_fetch_and_add(&ctx
.count
, 1);
569 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
570 EXPECT_EQ(ctx
.count
, 2);
572 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
573 pthread_kill(emitter
, SIGUSR1
);
574 pthread_join(emitter
, NULL
);
594 struct epoll_event events
[2];
595 struct epoll_mtcontext ctx
= { 0 };
597 signal(SIGUSR1
, signal_handler
);
599 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
600 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
602 ctx
.efd
[0] = epoll_create(1);
603 ASSERT_GE(ctx
.efd
[0], 0);
605 events
[0].events
= EPOLLIN
| EPOLLET
;
606 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], events
), 0);
608 events
[0].events
= EPOLLIN
| EPOLLET
;
609 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[2], events
), 0);
611 ctx
.main
= pthread_self();
612 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
613 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
615 if (epoll_wait(ctx
.efd
[0], events
, 1, -1) > 0)
616 __sync_fetch_and_add(&ctx
.count
, 1);
618 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
619 EXPECT_EQ(ctx
.count
, 2);
621 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
622 pthread_kill(emitter
, SIGUSR1
);
623 pthread_join(emitter
, NULL
);
643 struct epoll_event e
;
644 struct epoll_mtcontext ctx
= { 0 };
646 signal(SIGUSR1
, signal_handler
);
648 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
650 ctx
.efd
[0] = epoll_create(1);
651 ASSERT_GE(ctx
.efd
[0], 0);
654 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
656 ctx
.main
= pthread_self();
657 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
658 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
660 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
661 __sync_fetch_and_add(&ctx
.count
, 1);
663 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
664 EXPECT_EQ(ctx
.count
, 2);
666 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
667 pthread_kill(emitter
, SIGUSR1
);
668 pthread_join(emitter
, NULL
);
686 struct epoll_event e
;
687 struct epoll_mtcontext ctx
= { 0 };
689 signal(SIGUSR1
, signal_handler
);
691 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
693 ctx
.efd
[0] = epoll_create(1);
694 ASSERT_GE(ctx
.efd
[0], 0);
696 e
.events
= EPOLLIN
| EPOLLET
;
697 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
699 ctx
.main
= pthread_self();
700 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
701 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
703 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
704 __sync_fetch_and_add(&ctx
.count
, 1);
706 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
707 EXPECT_EQ(ctx
.count
, 1);
709 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
710 pthread_kill(emitter
, SIGUSR1
);
711 pthread_join(emitter
, NULL
);
729 struct epoll_event events
[2];
730 struct epoll_mtcontext ctx
= { 0 };
732 signal(SIGUSR1
, signal_handler
);
734 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
735 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
737 ctx
.efd
[0] = epoll_create(1);
738 ASSERT_GE(ctx
.efd
[0], 0);
740 events
[0].events
= EPOLLIN
;
741 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], events
), 0);
743 events
[0].events
= EPOLLIN
;
744 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[2], events
), 0);
746 ctx
.main
= pthread_self();
747 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry2ap
, &ctx
), 0);
748 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
750 if (epoll_wait(ctx
.efd
[0], events
, 2, -1) > 0)
751 __sync_fetch_and_add(&ctx
.count
, 1);
753 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
754 EXPECT_EQ(ctx
.count
, 2);
756 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
757 pthread_kill(emitter
, SIGUSR1
);
758 pthread_join(emitter
, NULL
);
778 struct epoll_event events
[2];
779 struct epoll_mtcontext ctx
= { 0 };
781 signal(SIGUSR1
, signal_handler
);
783 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
784 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
786 ctx
.efd
[0] = epoll_create(1);
787 ASSERT_GE(ctx
.efd
[0], 0);
789 events
[0].events
= EPOLLIN
| EPOLLET
;
790 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], events
), 0);
792 events
[0].events
= EPOLLIN
| EPOLLET
;
793 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[2], events
), 0);
795 ctx
.main
= pthread_self();
796 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
797 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
799 if (epoll_wait(ctx
.efd
[0], events
, 1, -1) > 0)
800 __sync_fetch_and_add(&ctx
.count
, 1);
802 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
803 EXPECT_EQ(ctx
.count
, 2);
805 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
806 pthread_kill(emitter
, SIGUSR1
);
807 pthread_join(emitter
, NULL
);
830 struct epoll_event e
;
832 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
834 efd
[0] = epoll_create(1);
835 ASSERT_GE(efd
[0], 0);
837 efd
[1] = epoll_create(1);
838 ASSERT_GE(efd
[1], 0);
841 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
844 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
846 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
848 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
849 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
870 struct epoll_event e
;
872 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
874 efd
[0] = epoll_create(1);
875 ASSERT_GE(efd
[0], 0);
877 efd
[1] = epoll_create(1);
878 ASSERT_GE(efd
[1], 0);
880 e
.events
= EPOLLIN
| EPOLLET
;
881 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
884 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
886 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
888 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
889 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
910 struct epoll_event e
;
912 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
914 efd
[0] = epoll_create(1);
915 ASSERT_GE(efd
[0], 0);
917 efd
[1] = epoll_create(1);
918 ASSERT_GE(efd
[1], 0);
921 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
923 e
.events
= EPOLLIN
| EPOLLET
;
924 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
926 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
928 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
929 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 0);
950 struct epoll_event e
;
952 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
954 efd
[0] = epoll_create(1);
955 ASSERT_GE(efd
[0], 0);
957 efd
[1] = epoll_create(1);
958 ASSERT_GE(efd
[1], 0);
960 e
.events
= EPOLLIN
| EPOLLET
;
961 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
963 e
.events
= EPOLLIN
| EPOLLET
;
964 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
966 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
968 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
969 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 0);
991 struct epoll_event e
;
993 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
995 efd
[0] = epoll_create(1);
996 ASSERT_GE(efd
[0], 0);
998 efd
[1] = epoll_create(1);
999 ASSERT_GE(efd
[1], 0);
1002 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
1005 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
1007 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
1010 pfd
.events
= POLLIN
;
1011 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
1012 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
1015 pfd
.events
= POLLIN
;
1016 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
1017 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
1039 struct epoll_event e
;
1041 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
1043 efd
[0] = epoll_create(1);
1044 ASSERT_GE(efd
[0], 0);
1046 efd
[1] = epoll_create(1);
1047 ASSERT_GE(efd
[1], 0);
1049 e
.events
= EPOLLIN
| EPOLLET
;
1050 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
1053 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
1055 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
1058 pfd
.events
= POLLIN
;
1059 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
1060 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
1063 pfd
.events
= POLLIN
;
1064 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
1065 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
1087 struct epoll_event e
;
1089 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
1091 efd
[0] = epoll_create(1);
1092 ASSERT_GE(efd
[0], 0);
1094 efd
[1] = epoll_create(1);
1095 ASSERT_GE(efd
[1], 0);
1098 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
1100 e
.events
= EPOLLIN
| EPOLLET
;
1101 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
1103 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
1106 pfd
.events
= POLLIN
;
1107 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
1108 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
1111 pfd
.events
= POLLIN
;
1112 EXPECT_EQ(poll(&pfd
, 1, 0), 0);
1113 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 0);
1135 struct epoll_event e
;
1137 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, sfd
), 0);
1139 efd
[0] = epoll_create(1);
1140 ASSERT_GE(efd
[0], 0);
1142 efd
[1] = epoll_create(1);
1143 ASSERT_GE(efd
[1], 0);
1145 e
.events
= EPOLLIN
| EPOLLET
;
1146 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], &e
), 0);
1148 e
.events
= EPOLLIN
| EPOLLET
;
1149 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], &e
), 0);
1151 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
1154 pfd
.events
= POLLIN
;
1155 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
1156 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 1);
1159 pfd
.events
= POLLIN
;
1160 EXPECT_EQ(poll(&pfd
, 1, 0), 0);
1161 EXPECT_EQ(epoll_wait(efd
[0], &e
, 1, 0), 0);
1181 struct epoll_event e
;
1182 struct epoll_mtcontext ctx
= { 0 };
1184 signal(SIGUSR1
, signal_handler
);
1186 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1188 ctx
.efd
[0] = epoll_create(1);
1189 ASSERT_GE(ctx
.efd
[0], 0);
1191 ctx
.efd
[1] = epoll_create(1);
1192 ASSERT_GE(ctx
.efd
[1], 0);
1195 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1198 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1200 ctx
.main
= pthread_self();
1201 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1202 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1204 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1205 __sync_fetch_and_add(&ctx
.count
, 1);
1207 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1208 EXPECT_EQ(ctx
.count
, 2);
1210 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1211 pthread_kill(emitter
, SIGUSR1
);
1212 pthread_join(emitter
, NULL
);
1233 struct epoll_event e
;
1234 struct epoll_mtcontext ctx
= { 0 };
1236 signal(SIGUSR1
, signal_handler
);
1238 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1240 ctx
.efd
[0] = epoll_create(1);
1241 ASSERT_GE(ctx
.efd
[0], 0);
1243 ctx
.efd
[1] = epoll_create(1);
1244 ASSERT_GE(ctx
.efd
[1], 0);
1246 e
.events
= EPOLLIN
| EPOLLET
;
1247 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1250 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1252 ctx
.main
= pthread_self();
1253 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1254 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1256 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1257 __sync_fetch_and_add(&ctx
.count
, 1);
1259 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1260 EXPECT_EQ(ctx
.count
, 2);
1262 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1263 pthread_kill(emitter
, SIGUSR1
);
1264 pthread_join(emitter
, NULL
);
1285 struct epoll_event e
;
1286 struct epoll_mtcontext ctx
= { 0 };
1288 signal(SIGUSR1
, signal_handler
);
1290 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1292 ctx
.efd
[0] = epoll_create(1);
1293 ASSERT_GE(ctx
.efd
[0], 0);
1295 ctx
.efd
[1] = epoll_create(1);
1296 ASSERT_GE(ctx
.efd
[1], 0);
1299 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1301 e
.events
= EPOLLIN
| EPOLLET
;
1302 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1304 ctx
.main
= pthread_self();
1305 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1306 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1308 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1309 __sync_fetch_and_add(&ctx
.count
, 1);
1311 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1312 EXPECT_EQ(ctx
.count
, 1);
1314 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1315 pthread_kill(emitter
, SIGUSR1
);
1316 pthread_join(emitter
, NULL
);
1337 struct epoll_event e
;
1338 struct epoll_mtcontext ctx
= { 0 };
1340 signal(SIGUSR1
, signal_handler
);
1342 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1344 ctx
.efd
[0] = epoll_create(1);
1345 ASSERT_GE(ctx
.efd
[0], 0);
1347 ctx
.efd
[1] = epoll_create(1);
1348 ASSERT_GE(ctx
.efd
[1], 0);
1350 e
.events
= EPOLLIN
| EPOLLET
;
1351 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1353 e
.events
= EPOLLIN
| EPOLLET
;
1354 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1356 ctx
.main
= pthread_self();
1357 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1358 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1360 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1361 __sync_fetch_and_add(&ctx
.count
, 1);
1363 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1364 EXPECT_EQ(ctx
.count
, 1);
1366 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1367 pthread_kill(emitter
, SIGUSR1
);
1368 pthread_join(emitter
, NULL
);
1389 struct epoll_event e
;
1390 struct epoll_mtcontext ctx
= { 0 };
1392 signal(SIGUSR1
, signal_handler
);
1394 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1396 ctx
.efd
[0] = epoll_create(1);
1397 ASSERT_GE(ctx
.efd
[0], 0);
1399 ctx
.efd
[1] = epoll_create(1);
1400 ASSERT_GE(ctx
.efd
[1], 0);
1403 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1406 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1408 ctx
.main
= pthread_self();
1409 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
1410 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1412 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1413 __sync_fetch_and_add(&ctx
.count
, 1);
1415 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1416 EXPECT_EQ(ctx
.count
, 2);
1418 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1419 pthread_kill(emitter
, SIGUSR1
);
1420 pthread_join(emitter
, NULL
);
1440 struct epoll_event e
;
1441 struct epoll_mtcontext ctx
= { 0 };
1443 signal(SIGUSR1
, signal_handler
);
1445 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1447 ctx
.efd
[0] = epoll_create(1);
1448 ASSERT_GE(ctx
.efd
[0], 0);
1450 ctx
.efd
[1] = epoll_create(1);
1451 ASSERT_GE(ctx
.efd
[1], 0);
1453 e
.events
= EPOLLIN
| EPOLLET
;
1454 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1457 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1459 ctx
.main
= pthread_self();
1460 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
1461 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1463 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1464 __sync_fetch_and_add(&ctx
.count
, 1);
1466 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1467 EXPECT_EQ(ctx
.count
, 2);
1469 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1470 pthread_kill(emitter
, SIGUSR1
);
1471 pthread_join(emitter
, NULL
);
1491 struct epoll_event e
;
1492 struct epoll_mtcontext ctx
= { 0 };
1494 signal(SIGUSR1
, signal_handler
);
1496 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1498 ctx
.efd
[0] = epoll_create(1);
1499 ASSERT_GE(ctx
.efd
[0], 0);
1501 ctx
.efd
[1] = epoll_create(1);
1502 ASSERT_GE(ctx
.efd
[1], 0);
1505 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1507 e
.events
= EPOLLIN
| EPOLLET
;
1508 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1510 ctx
.main
= pthread_self();
1511 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
1512 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1514 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1515 __sync_fetch_and_add(&ctx
.count
, 1);
1517 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1518 EXPECT_EQ(ctx
.count
, 1);
1520 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1521 pthread_kill(emitter
, SIGUSR1
);
1522 pthread_join(emitter
, NULL
);
1542 struct epoll_event e
;
1543 struct epoll_mtcontext ctx
= { 0 };
1545 signal(SIGUSR1
, signal_handler
);
1547 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1549 ctx
.efd
[0] = epoll_create(1);
1550 ASSERT_GE(ctx
.efd
[0], 0);
1552 ctx
.efd
[1] = epoll_create(1);
1553 ASSERT_GE(ctx
.efd
[1], 0);
1555 e
.events
= EPOLLIN
| EPOLLET
;
1556 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1558 e
.events
= EPOLLIN
| EPOLLET
;
1559 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1561 ctx
.main
= pthread_self();
1562 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
1563 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1565 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
1566 __sync_fetch_and_add(&ctx
.count
, 1);
1568 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1569 EXPECT_EQ(ctx
.count
, 1);
1571 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1572 pthread_kill(emitter
, SIGUSR1
);
1573 pthread_join(emitter
, NULL
);
1593 struct epoll_event e
;
1594 struct epoll_mtcontext ctx
= { 0 };
1596 signal(SIGUSR1
, signal_handler
);
1598 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1600 ctx
.efd
[0] = epoll_create(1);
1601 ASSERT_GE(ctx
.efd
[0], 0);
1603 ctx
.efd
[1] = epoll_create(1);
1604 ASSERT_GE(ctx
.efd
[1], 0);
1607 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1610 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1612 ctx
.main
= pthread_self();
1613 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1614 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1616 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
1617 __sync_fetch_and_add(&ctx
.count
, 1);
1619 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1620 EXPECT_EQ(ctx
.count
, 2);
1622 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1623 pthread_kill(emitter
, SIGUSR1
);
1624 pthread_join(emitter
, NULL
);
1645 struct epoll_event e
;
1646 struct epoll_mtcontext ctx
= { 0 };
1648 signal(SIGUSR1
, signal_handler
);
1650 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1652 ctx
.efd
[0] = epoll_create(1);
1653 ASSERT_GE(ctx
.efd
[0], 0);
1655 ctx
.efd
[1] = epoll_create(1);
1656 ASSERT_GE(ctx
.efd
[1], 0);
1658 e
.events
= EPOLLIN
| EPOLLET
;
1659 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1662 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1664 ctx
.main
= pthread_self();
1665 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1o
, &ctx
), 0);
1666 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1668 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
1669 __sync_fetch_and_or(&ctx
.count
, 2);
1671 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1672 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
1674 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1675 pthread_kill(emitter
, SIGUSR1
);
1676 pthread_join(emitter
, NULL
);
1697 struct epoll_event e
;
1698 struct epoll_mtcontext ctx
= { 0 };
1700 signal(SIGUSR1
, signal_handler
);
1702 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1704 ctx
.efd
[0] = epoll_create(1);
1705 ASSERT_GE(ctx
.efd
[0], 0);
1707 ctx
.efd
[1] = epoll_create(1);
1708 ASSERT_GE(ctx
.efd
[1], 0);
1711 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1713 e
.events
= EPOLLIN
| EPOLLET
;
1714 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1716 ctx
.main
= pthread_self();
1717 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1718 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1720 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
1721 __sync_fetch_and_add(&ctx
.count
, 1);
1723 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1724 EXPECT_EQ(ctx
.count
, 2);
1726 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1727 pthread_kill(emitter
, SIGUSR1
);
1728 pthread_join(emitter
, NULL
);
1749 struct epoll_event e
;
1750 struct epoll_mtcontext ctx
= { 0 };
1752 signal(SIGUSR1
, signal_handler
);
1754 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1756 ctx
.efd
[0] = epoll_create(1);
1757 ASSERT_GE(ctx
.efd
[0], 0);
1759 ctx
.efd
[1] = epoll_create(1);
1760 ASSERT_GE(ctx
.efd
[1], 0);
1762 e
.events
= EPOLLIN
| EPOLLET
;
1763 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1765 e
.events
= EPOLLIN
| EPOLLET
;
1766 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1768 ctx
.main
= pthread_self();
1769 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1o
, &ctx
), 0);
1770 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1772 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
1773 __sync_fetch_and_or(&ctx
.count
, 2);
1775 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1776 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
1778 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1779 pthread_kill(emitter
, SIGUSR1
);
1780 pthread_join(emitter
, NULL
);
1802 struct epoll_event e
;
1803 struct epoll_mtcontext ctx
= { 0 };
1805 signal(SIGUSR1
, signal_handler
);
1807 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1809 ctx
.efd
[0] = epoll_create(1);
1810 ASSERT_GE(ctx
.efd
[0], 0);
1812 ctx
.efd
[1] = epoll_create(1);
1813 ASSERT_GE(ctx
.efd
[1], 0);
1816 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1819 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1821 ctx
.main
= pthread_self();
1822 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1823 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1825 pfd
.fd
= ctx
.efd
[1];
1826 pfd
.events
= POLLIN
;
1827 if (poll(&pfd
, 1, -1) > 0) {
1828 if (epoll_wait(ctx
.efd
[1], &e
, 1, 0) > 0)
1829 __sync_fetch_and_add(&ctx
.count
, 1);
1832 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1833 EXPECT_EQ(ctx
.count
, 2);
1835 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1836 pthread_kill(emitter
, SIGUSR1
);
1837 pthread_join(emitter
, NULL
);
1859 struct epoll_event e
;
1860 struct epoll_mtcontext ctx
= { 0 };
1862 signal(SIGUSR1
, signal_handler
);
1864 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1866 ctx
.efd
[0] = epoll_create(1);
1867 ASSERT_GE(ctx
.efd
[0], 0);
1869 ctx
.efd
[1] = epoll_create(1);
1870 ASSERT_GE(ctx
.efd
[1], 0);
1872 e
.events
= EPOLLIN
| EPOLLET
;
1873 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1876 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1878 ctx
.main
= pthread_self();
1879 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1o
, &ctx
), 0);
1880 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1882 pfd
.fd
= ctx
.efd
[1];
1883 pfd
.events
= POLLIN
;
1884 if (poll(&pfd
, 1, -1) > 0) {
1885 if (epoll_wait(ctx
.efd
[1], &e
, 1, 0) > 0)
1886 __sync_fetch_and_or(&ctx
.count
, 2);
1889 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1890 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
1892 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1893 pthread_kill(emitter
, SIGUSR1
);
1894 pthread_join(emitter
, NULL
);
1916 struct epoll_event e
;
1917 struct epoll_mtcontext ctx
= { 0 };
1919 signal(SIGUSR1
, signal_handler
);
1921 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1923 ctx
.efd
[0] = epoll_create(1);
1924 ASSERT_GE(ctx
.efd
[0], 0);
1926 ctx
.efd
[1] = epoll_create(1);
1927 ASSERT_GE(ctx
.efd
[1], 0);
1930 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1932 e
.events
= EPOLLIN
| EPOLLET
;
1933 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1935 ctx
.main
= pthread_self();
1936 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
1937 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1939 pfd
.fd
= ctx
.efd
[1];
1940 pfd
.events
= POLLIN
;
1941 if (poll(&pfd
, 1, -1) > 0) {
1942 if (epoll_wait(ctx
.efd
[1], &e
, 1, 0) > 0)
1943 __sync_fetch_and_add(&ctx
.count
, 1);
1946 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
1947 EXPECT_EQ(ctx
.count
, 2);
1949 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
1950 pthread_kill(emitter
, SIGUSR1
);
1951 pthread_join(emitter
, NULL
);
1973 struct epoll_event e
;
1974 struct epoll_mtcontext ctx
= { 0 };
1976 signal(SIGUSR1
, signal_handler
);
1978 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
1980 ctx
.efd
[0] = epoll_create(1);
1981 ASSERT_GE(ctx
.efd
[0], 0);
1983 ctx
.efd
[1] = epoll_create(1);
1984 ASSERT_GE(ctx
.efd
[1], 0);
1986 e
.events
= EPOLLIN
| EPOLLET
;
1987 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
1989 e
.events
= EPOLLIN
| EPOLLET
;
1990 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
1992 ctx
.main
= pthread_self();
1993 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1o
, &ctx
), 0);
1994 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
1996 pfd
.fd
= ctx
.efd
[1];
1997 pfd
.events
= POLLIN
;
1998 if (poll(&pfd
, 1, -1) > 0) {
1999 if (epoll_wait(ctx
.efd
[1], &e
, 1, 0) > 0)
2000 __sync_fetch_and_or(&ctx
.count
, 2);
2003 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2004 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
2006 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2007 pthread_kill(emitter
, SIGUSR1
);
2008 pthread_join(emitter
, NULL
);
2029 struct epoll_event e
;
2030 struct epoll_mtcontext ctx
= { 0 };
2032 signal(SIGUSR1
, signal_handler
);
2034 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2036 ctx
.efd
[0] = epoll_create(1);
2037 ASSERT_GE(ctx
.efd
[0], 0);
2039 ctx
.efd
[1] = epoll_create(1);
2040 ASSERT_GE(ctx
.efd
[1], 0);
2043 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2046 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2048 ctx
.main
= pthread_self();
2049 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2050 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2052 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
2053 __sync_fetch_and_add(&ctx
.count
, 1);
2055 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2056 EXPECT_EQ(ctx
.count
, 2);
2058 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2059 pthread_kill(emitter
, SIGUSR1
);
2060 pthread_join(emitter
, NULL
);
2081 struct epoll_event e
;
2082 struct epoll_mtcontext ctx
= { 0 };
2084 signal(SIGUSR1
, signal_handler
);
2086 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2088 ctx
.efd
[0] = epoll_create(1);
2089 ASSERT_GE(ctx
.efd
[0], 0);
2091 ctx
.efd
[1] = epoll_create(1);
2092 ASSERT_GE(ctx
.efd
[1], 0);
2094 e
.events
= EPOLLIN
| EPOLLET
;
2095 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2098 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2100 ctx
.main
= pthread_self();
2101 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1op
, &ctx
), 0);
2102 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2104 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
2105 __sync_fetch_and_or(&ctx
.count
, 2);
2107 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2108 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
2110 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2111 pthread_kill(emitter
, SIGUSR1
);
2112 pthread_join(emitter
, NULL
);
2133 struct epoll_event e
;
2134 struct epoll_mtcontext ctx
= { 0 };
2136 signal(SIGUSR1
, signal_handler
);
2138 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2140 ctx
.efd
[0] = epoll_create(1);
2141 ASSERT_GE(ctx
.efd
[0], 0);
2143 ctx
.efd
[1] = epoll_create(1);
2144 ASSERT_GE(ctx
.efd
[1], 0);
2147 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2149 e
.events
= EPOLLIN
| EPOLLET
;
2150 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2152 ctx
.main
= pthread_self();
2153 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2154 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2156 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
2157 __sync_fetch_and_add(&ctx
.count
, 1);
2159 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2160 EXPECT_EQ(ctx
.count
, 2);
2162 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2163 pthread_kill(emitter
, SIGUSR1
);
2164 pthread_join(emitter
, NULL
);
2185 struct epoll_event e
;
2186 struct epoll_mtcontext ctx
= { 0 };
2188 signal(SIGUSR1
, signal_handler
);
2190 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2192 ctx
.efd
[0] = epoll_create(1);
2193 ASSERT_GE(ctx
.efd
[0], 0);
2195 ctx
.efd
[1] = epoll_create(1);
2196 ASSERT_GE(ctx
.efd
[1], 0);
2198 e
.events
= EPOLLIN
| EPOLLET
;
2199 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2201 e
.events
= EPOLLIN
| EPOLLET
;
2202 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2204 ctx
.main
= pthread_self();
2205 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1op
, &ctx
), 0);
2206 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2208 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
2209 __sync_fetch_and_or(&ctx
.count
, 2);
2211 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2212 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
2214 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2215 pthread_kill(emitter
, SIGUSR1
);
2216 pthread_join(emitter
, NULL
);
2238 struct epoll_event e
;
2239 struct epoll_mtcontext ctx
= { 0 };
2241 signal(SIGUSR1
, signal_handler
);
2243 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2245 ctx
.efd
[0] = epoll_create(1);
2246 ASSERT_GE(ctx
.efd
[0], 0);
2248 ctx
.efd
[1] = epoll_create(1);
2249 ASSERT_GE(ctx
.efd
[1], 0);
2252 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2255 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2257 ctx
.main
= pthread_self();
2258 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2259 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2261 pfd
.fd
= ctx
.efd
[1];
2262 pfd
.events
= POLLIN
;
2263 if (poll(&pfd
, 1, -1) > 0) {
2264 if (epoll_wait(ctx
.efd
[1], &e
, 1, 0) > 0)
2265 __sync_fetch_and_add(&ctx
.count
, 1);
2268 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2269 EXPECT_EQ(ctx
.count
, 2);
2271 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2272 pthread_kill(emitter
, SIGUSR1
);
2273 pthread_join(emitter
, NULL
);
2294 struct epoll_event e
;
2295 struct epoll_mtcontext ctx
= { 0 };
2297 signal(SIGUSR1
, signal_handler
);
2299 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2301 ctx
.efd
[0] = epoll_create(1);
2302 ASSERT_GE(ctx
.efd
[0], 0);
2304 ctx
.efd
[1] = epoll_create(1);
2305 ASSERT_GE(ctx
.efd
[1], 0);
2307 e
.events
= EPOLLIN
| EPOLLET
;
2308 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2311 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2313 ctx
.main
= pthread_self();
2314 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1op
, &ctx
), 0);
2315 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2317 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
2318 __sync_fetch_and_or(&ctx
.count
, 2);
2320 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2321 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
2323 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2324 pthread_kill(emitter
, SIGUSR1
);
2325 pthread_join(emitter
, NULL
);
2347 struct epoll_event e
;
2348 struct epoll_mtcontext ctx
= { 0 };
2350 signal(SIGUSR1
, signal_handler
);
2352 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2354 ctx
.efd
[0] = epoll_create(1);
2355 ASSERT_GE(ctx
.efd
[0], 0);
2357 ctx
.efd
[1] = epoll_create(1);
2358 ASSERT_GE(ctx
.efd
[1], 0);
2361 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2363 e
.events
= EPOLLIN
| EPOLLET
;
2364 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2366 ctx
.main
= pthread_self();
2367 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2368 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2370 pfd
.fd
= ctx
.efd
[1];
2371 pfd
.events
= POLLIN
;
2372 if (poll(&pfd
, 1, -1) > 0) {
2373 if (epoll_wait(ctx
.efd
[1], &e
, 1, 0) > 0)
2374 __sync_fetch_and_add(&ctx
.count
, 1);
2377 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2378 EXPECT_EQ(ctx
.count
, 2);
2380 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2381 pthread_kill(emitter
, SIGUSR1
);
2382 pthread_join(emitter
, NULL
);
2403 struct epoll_event e
;
2404 struct epoll_mtcontext ctx
= { 0 };
2406 signal(SIGUSR1
, signal_handler
);
2408 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, ctx
.sfd
), 0);
2410 ctx
.efd
[0] = epoll_create(1);
2411 ASSERT_GE(ctx
.efd
[0], 0);
2413 ctx
.efd
[1] = epoll_create(1);
2414 ASSERT_GE(ctx
.efd
[1], 0);
2416 e
.events
= EPOLLIN
| EPOLLET
;
2417 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2419 e
.events
= EPOLLIN
| EPOLLET
;
2420 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2422 ctx
.main
= pthread_self();
2423 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1op
, &ctx
), 0);
2424 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry1
, &ctx
), 0);
2426 if (epoll_wait(ctx
.efd
[1], &e
, 1, -1) > 0)
2427 __sync_fetch_and_or(&ctx
.count
, 2);
2429 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2430 EXPECT_TRUE((ctx
.count
== 2) || (ctx
.count
== 3));
2432 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2433 pthread_kill(emitter
, SIGUSR1
);
2434 pthread_join(emitter
, NULL
);
2456 struct epoll_event events
[2];
2458 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
2459 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
2461 efd
[0] = epoll_create(1);
2462 ASSERT_GE(efd
[0], 0);
2464 efd
[1] = epoll_create(1);
2465 ASSERT_GE(efd
[1], 0);
2467 efd
[2] = epoll_create(1);
2468 ASSERT_GE(efd
[2], 0);
2470 events
[0].events
= EPOLLIN
;
2471 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], events
), 0);
2473 events
[0].events
= EPOLLIN
;
2474 ASSERT_EQ(epoll_ctl(efd
[2], EPOLL_CTL_ADD
, sfd
[2], events
), 0);
2476 events
[0].events
= EPOLLIN
;
2477 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], events
), 0);
2479 events
[0].events
= EPOLLIN
;
2480 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[2], events
), 0);
2482 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
2483 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
2485 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 2);
2486 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 2);
2510 struct epoll_event events
[2];
2512 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
2513 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
2515 efd
[0] = epoll_create(1);
2516 ASSERT_GE(efd
[0], 0);
2518 efd
[1] = epoll_create(1);
2519 ASSERT_GE(efd
[1], 0);
2521 efd
[2] = epoll_create(1);
2522 ASSERT_GE(efd
[2], 0);
2524 events
[0].events
= EPOLLIN
;
2525 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], events
), 0);
2527 events
[0].events
= EPOLLIN
;
2528 ASSERT_EQ(epoll_ctl(efd
[2], EPOLL_CTL_ADD
, sfd
[2], events
), 0);
2530 events
[0].events
= EPOLLIN
| EPOLLET
;
2531 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], events
), 0);
2533 events
[0].events
= EPOLLIN
| EPOLLET
;
2534 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[2], events
), 0);
2536 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
2537 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
2539 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 2);
2540 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 0);
2565 struct epoll_event events
[2];
2567 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
2568 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
2570 efd
[0] = epoll_create(1);
2571 ASSERT_GE(efd
[0], 0);
2573 efd
[1] = epoll_create(1);
2574 ASSERT_GE(efd
[1], 0);
2576 efd
[2] = epoll_create(1);
2577 ASSERT_GE(efd
[2], 0);
2579 events
[0].events
= EPOLLIN
;
2580 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], events
), 0);
2582 events
[0].events
= EPOLLIN
;
2583 ASSERT_EQ(epoll_ctl(efd
[2], EPOLL_CTL_ADD
, sfd
[2], events
), 0);
2585 events
[0].events
= EPOLLIN
;
2586 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], events
), 0);
2588 events
[0].events
= EPOLLIN
;
2589 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[2], events
), 0);
2591 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
2592 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
2595 pfd
.events
= POLLIN
;
2596 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
2597 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 2);
2600 pfd
.events
= POLLIN
;
2601 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
2602 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 2);
2627 struct epoll_event events
[2];
2629 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[0]), 0);
2630 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &sfd
[2]), 0);
2632 efd
[0] = epoll_create(1);
2633 ASSERT_GE(efd
[0], 0);
2635 efd
[1] = epoll_create(1);
2636 ASSERT_GE(efd
[1], 0);
2638 efd
[2] = epoll_create(1);
2639 ASSERT_GE(efd
[2], 0);
2641 events
[0].events
= EPOLLIN
;
2642 ASSERT_EQ(epoll_ctl(efd
[1], EPOLL_CTL_ADD
, sfd
[0], events
), 0);
2644 events
[0].events
= EPOLLIN
;
2645 ASSERT_EQ(epoll_ctl(efd
[2], EPOLL_CTL_ADD
, sfd
[2], events
), 0);
2647 events
[0].events
= EPOLLIN
| EPOLLET
;
2648 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[1], events
), 0);
2650 events
[0].events
= EPOLLIN
| EPOLLET
;
2651 ASSERT_EQ(epoll_ctl(efd
[0], EPOLL_CTL_ADD
, efd
[2], events
), 0);
2653 ASSERT_EQ(write(sfd
[1], "w", 1), 1);
2654 ASSERT_EQ(write(sfd
[3], "w", 1), 1);
2657 pfd
.events
= POLLIN
;
2658 EXPECT_EQ(poll(&pfd
, 1, 0), 1);
2659 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 2);
2662 pfd
.events
= POLLIN
;
2663 EXPECT_EQ(poll(&pfd
, 1, 0), 0);
2664 EXPECT_EQ(epoll_wait(efd
[0], events
, 2, 0), 0);
2687 struct epoll_event e
;
2688 struct epoll_mtcontext ctx
= { 0 };
2690 signal(SIGUSR1
, signal_handler
);
2692 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
2693 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
2695 ctx
.efd
[0] = epoll_create(1);
2696 ASSERT_GE(ctx
.efd
[0], 0);
2698 ctx
.efd
[1] = epoll_create(1);
2699 ASSERT_GE(ctx
.efd
[1], 0);
2701 ctx
.efd
[2] = epoll_create(1);
2702 ASSERT_GE(ctx
.efd
[2], 0);
2705 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2708 ASSERT_EQ(epoll_ctl(ctx
.efd
[2], EPOLL_CTL_ADD
, ctx
.sfd
[2], &e
), 0);
2711 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2714 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[2], &e
), 0);
2716 ctx
.main
= pthread_self();
2717 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
2718 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
2720 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
2721 __sync_fetch_and_add(&ctx
.count
, 1);
2723 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2724 EXPECT_EQ(ctx
.count
, 2);
2726 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2727 pthread_kill(emitter
, SIGUSR1
);
2728 pthread_join(emitter
, NULL
);
2752 struct epoll_event e
;
2753 struct epoll_mtcontext ctx
= { 0 };
2755 signal(SIGUSR1
, signal_handler
);
2757 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
2758 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
2760 ctx
.efd
[0] = epoll_create(1);
2761 ASSERT_GE(ctx
.efd
[0], 0);
2763 ctx
.efd
[1] = epoll_create(1);
2764 ASSERT_GE(ctx
.efd
[1], 0);
2766 ctx
.efd
[2] = epoll_create(1);
2767 ASSERT_GE(ctx
.efd
[2], 0);
2770 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2773 ASSERT_EQ(epoll_ctl(ctx
.efd
[2], EPOLL_CTL_ADD
, ctx
.sfd
[2], &e
), 0);
2775 e
.events
= EPOLLIN
| EPOLLET
;
2776 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2778 e
.events
= EPOLLIN
| EPOLLET
;
2779 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[2], &e
), 0);
2781 ctx
.main
= pthread_self();
2782 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1a
, &ctx
), 0);
2783 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
2785 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
2786 __sync_fetch_and_add(&ctx
.count
, 1);
2788 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2789 EXPECT_EQ(ctx
.count
, 2);
2791 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2792 pthread_kill(emitter
, SIGUSR1
);
2793 pthread_join(emitter
, NULL
);
2817 struct epoll_event e
;
2818 struct epoll_mtcontext ctx
= { 0 };
2820 signal(SIGUSR1
, signal_handler
);
2822 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
2823 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
2825 ctx
.efd
[0] = epoll_create(1);
2826 ASSERT_GE(ctx
.efd
[0], 0);
2828 ctx
.efd
[1] = epoll_create(1);
2829 ASSERT_GE(ctx
.efd
[1], 0);
2831 ctx
.efd
[2] = epoll_create(1);
2832 ASSERT_GE(ctx
.efd
[2], 0);
2835 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2838 ASSERT_EQ(epoll_ctl(ctx
.efd
[2], EPOLL_CTL_ADD
, ctx
.sfd
[2], &e
), 0);
2841 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2844 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[2], &e
), 0);
2846 ctx
.main
= pthread_self();
2847 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2848 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
2850 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
2851 __sync_fetch_and_add(&ctx
.count
, 1);
2853 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2854 EXPECT_EQ(ctx
.count
, 2);
2856 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2857 pthread_kill(emitter
, SIGUSR1
);
2858 pthread_join(emitter
, NULL
);
2882 struct epoll_event e
;
2883 struct epoll_mtcontext ctx
= { 0 };
2885 signal(SIGUSR1
, signal_handler
);
2887 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
2888 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
2890 ctx
.efd
[0] = epoll_create(1);
2891 ASSERT_GE(ctx
.efd
[0], 0);
2893 ctx
.efd
[1] = epoll_create(1);
2894 ASSERT_GE(ctx
.efd
[1], 0);
2896 ctx
.efd
[2] = epoll_create(1);
2897 ASSERT_GE(ctx
.efd
[2], 0);
2900 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2903 ASSERT_EQ(epoll_ctl(ctx
.efd
[2], EPOLL_CTL_ADD
, ctx
.sfd
[2], &e
), 0);
2905 e
.events
= EPOLLIN
| EPOLLET
;
2906 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2908 e
.events
= EPOLLIN
| EPOLLET
;
2909 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[2], &e
), 0);
2911 ctx
.main
= pthread_self();
2912 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2913 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
2915 if (epoll_wait(ctx
.efd
[0], &e
, 1, -1) > 0)
2916 __sync_fetch_and_add(&ctx
.count
, 1);
2918 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2919 EXPECT_EQ(ctx
.count
, 2);
2921 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2922 pthread_kill(emitter
, SIGUSR1
);
2923 pthread_join(emitter
, NULL
);
2948 struct epoll_event e
;
2949 struct epoll_mtcontext ctx
= { 0 };
2951 signal(SIGUSR1
, signal_handler
);
2953 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
2954 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
2956 ctx
.efd
[0] = epoll_create(1);
2957 ASSERT_GE(ctx
.efd
[0], 0);
2959 ctx
.efd
[1] = epoll_create(1);
2960 ASSERT_GE(ctx
.efd
[1], 0);
2962 ctx
.efd
[2] = epoll_create(1);
2963 ASSERT_GE(ctx
.efd
[2], 0);
2966 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
2969 ASSERT_EQ(epoll_ctl(ctx
.efd
[2], EPOLL_CTL_ADD
, ctx
.sfd
[2], &e
), 0);
2972 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
2975 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[2], &e
), 0);
2977 ctx
.main
= pthread_self();
2978 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
2979 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
2981 pfd
.fd
= ctx
.efd
[0];
2982 pfd
.events
= POLLIN
;
2983 if (poll(&pfd
, 1, -1) > 0) {
2984 if (epoll_wait(ctx
.efd
[0], &e
, 1, 0) > 0)
2985 __sync_fetch_and_add(&ctx
.count
, 1);
2988 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
2989 EXPECT_EQ(ctx
.count
, 2);
2991 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
2992 pthread_kill(emitter
, SIGUSR1
);
2993 pthread_join(emitter
, NULL
);
3018 struct epoll_event e
;
3019 struct epoll_mtcontext ctx
= { 0 };
3021 signal(SIGUSR1
, signal_handler
);
3023 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[0]), 0);
3024 ASSERT_EQ(socketpair(AF_UNIX
, SOCK_STREAM
, 0, &ctx
.sfd
[2]), 0);
3026 ctx
.efd
[0] = epoll_create(1);
3027 ASSERT_GE(ctx
.efd
[0], 0);
3029 ctx
.efd
[1] = epoll_create(1);
3030 ASSERT_GE(ctx
.efd
[1], 0);
3032 ctx
.efd
[2] = epoll_create(1);
3033 ASSERT_GE(ctx
.efd
[2], 0);
3036 ASSERT_EQ(epoll_ctl(ctx
.efd
[1], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
3039 ASSERT_EQ(epoll_ctl(ctx
.efd
[2], EPOLL_CTL_ADD
, ctx
.sfd
[2], &e
), 0);
3041 e
.events
= EPOLLIN
| EPOLLET
;
3042 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[1], &e
), 0);
3044 e
.events
= EPOLLIN
| EPOLLET
;
3045 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.efd
[2], &e
), 0);
3047 ctx
.main
= pthread_self();
3048 ASSERT_EQ(pthread_create(&ctx
.waiter
, NULL
, waiter_entry1ap
, &ctx
), 0);
3049 ASSERT_EQ(pthread_create(&emitter
, NULL
, emitter_entry2
, &ctx
), 0);
3051 pfd
.fd
= ctx
.efd
[0];
3052 pfd
.events
= POLLIN
;
3053 if (poll(&pfd
, 1, -1) > 0) {
3054 if (epoll_wait(ctx
.efd
[0], &e
, 1, 0) > 0)
3055 __sync_fetch_and_add(&ctx
.count
, 1);
3058 ASSERT_EQ(pthread_join(ctx
.waiter
, NULL
), 0);
3059 EXPECT_EQ(ctx
.count
, 2);
3061 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
3062 pthread_kill(emitter
, SIGUSR1
);
3063 pthread_join(emitter
, NULL
);
3075 static void *epoll59_thread(void *ctx_
)
3077 struct epoll_mtcontext
*ctx
= ctx_
;
3078 struct epoll_event e
;
3081 for (i
= 0; i
< 100000; i
++) {
3082 while (ctx
->count
== 0)
3085 e
.events
= EPOLLIN
| EPOLLERR
| EPOLLET
;
3086 epoll_ctl(ctx
->efd
[0], EPOLL_CTL_MOD
, ctx
->sfd
[0], &e
);
3100 * Based on https://bugzilla.kernel.org/show_bug.cgi?id=205933
3106 struct epoll_event e
;
3107 struct epoll_mtcontext ctx
= { 0 };
3110 signal(SIGUSR1
, signal_handler
);
3112 ctx
.efd
[0] = epoll_create1(0);
3113 ASSERT_GE(ctx
.efd
[0], 0);
3115 ctx
.sfd
[0] = eventfd(1, 0);
3116 ASSERT_GE(ctx
.sfd
[0], 0);
3118 e
.events
= EPOLLIN
| EPOLLERR
| EPOLLET
;
3119 ASSERT_EQ(epoll_ctl(ctx
.efd
[0], EPOLL_CTL_ADD
, ctx
.sfd
[0], &e
), 0);
3121 ASSERT_EQ(pthread_create(&emitter
, NULL
, epoll59_thread
, &ctx
), 0);
3123 for (i
= 0; i
< 100000; i
++) {
3124 ret
= epoll_wait(ctx
.efd
[0], &e
, 1, 1000);
3127 while (ctx
.count
!= 0)
3131 if (pthread_tryjoin_np(emitter
, NULL
) < 0) {
3132 pthread_kill(emitter
, SIGUSR1
);
3133 pthread_join(emitter
, NULL
);