brintos

brintos / linux-shallow public Read only

0
0
Text · 74.2 KiB · 65ede50 Raw
3497 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#define _GNU_SOURCE4#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 16struct epoll_mtcontext17{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_pwait227#define __NR_epoll_pwait2 -128#endif29 30static 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 39static void signal_handler(int signum)40{41}42 43static 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 50static 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 61static 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 77static 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 88static 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 104static 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 115static 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 131static 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 143static 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 *          t0158 *           | (ew)159 *          e0160 *           | (lt)161 *          s0162 */163TEST(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 *          t0189 *           | (ew)190 *          e0191 *           | (et)192 *          s0193 */194TEST(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 *           t0220 *            | (ew)221 *           e0222 *     (lt) /  \ (lt)223 *        s0    s2224 */225TEST(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 *           t0258 *            | (ew)259 *           e0260 *     (et) /  \ (et)261 *        s0    s2262 */263TEST(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 *          t0296 *           | (p)297 *          e0298 *           | (lt)299 *          s0300 */301TEST(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 *          t0335 *           | (p)336 *          e0337 *           | (et)338 *          s0339 */340TEST(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 *           t0374 *            | (p)375 *           e0376 *     (lt) /  \ (lt)377 *        s0    s2378 */379 380TEST(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 *           t0421 *            | (p)422 *           e0423 *     (et) /  \ (et)424 *        s0    s2425 */426TEST(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    t1467 *     (ew) \  / (ew)468 *           e0469 *            | (lt)470 *           s0471 */472TEST(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    t1510 *     (ew) \  / (ew)511 *           e0512 *            | (et)513 *           s0514 */515TEST(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    t1553 *     (ew) \  / (ew)554 *           e0555 *     (lt) /  \ (lt)556 *        s0    s2557 */558TEST(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    t1602 *     (ew) \  / (ew)603 *           e0604 *     (et) /  \ (et)605 *        s0    s2606 */607TEST(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    t1651 *     (ew) \  / (p)652 *           e0653 *            | (lt)654 *           s0655 */656TEST(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    t1694 *     (ew) \  / (p)695 *           e0696 *            | (et)697 *           s0698 */699TEST(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    t1737 *     (ew) \  / (p)738 *           e0739 *     (lt) /  \ (lt)740 *        s0    s2741 */742TEST(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    t1786 *     (ew) \  / (p)787 *           e0788 *     (et) /  \ (et)789 *        s0    s2790 */791TEST(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 *          t0835 *           | (ew)836 *          e0837 *           | (lt)838 *          e1839 *           | (lt)840 *          s0841 */842TEST(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 *          t0875 *           | (ew)876 *          e0877 *           | (lt)878 *          e1879 *           | (et)880 *          s0881 */882TEST(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 *           t0915 *            | (ew)916 *           e0917 *            | (et)918 *           e1919 *            | (lt)920 *           s0921 */922TEST(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 *           t0955 *            | (ew)956 *           e0957 *            | (et)958 *           e1959 *            | (et)960 *           s0961 */962TEST(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 *          t0995 *           | (p)996 *          e0997 *           | (lt)998 *          e1999 *           | (lt)1000 *          s01001 */1002TEST(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 *          t01043 *           | (p)1044 *          e01045 *           | (lt)1046 *          e11047 *           | (et)1048 *          s01049 */1050TEST(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 *          t01091 *           | (p)1092 *          e01093 *           | (et)1094 *          e11095 *           | (lt)1096 *          s01097 */1098TEST(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 *          t01139 *           | (p)1140 *          e01141 *           | (et)1142 *          e11143 *           | (et)1144 *          s01145 */1146TEST(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    t11187 *     (ew) \  / (ew)1188 *           e01189 *            | (lt)1190 *           e11191 *            | (lt)1192 *           s01193 */1194TEST(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    t11239 *     (ew) \  / (ew)1240 *           e01241 *            | (lt)1242 *           e11243 *            | (et)1244 *           s01245 */1246TEST(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    t11291 *     (ew) \  / (ew)1292 *           e01293 *            | (et)1294 *           e11295 *            | (lt)1296 *           s01297 */1298TEST(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    t11343 *     (ew) \  / (ew)1344 *           e01345 *            | (et)1346 *           e11347 *            | (et)1348 *           s01349 */1350TEST(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    t11395 *     (ew) \  / (p)1396 *           e01397 *            | (lt)1398 *           e11399 *            | (lt)1400 *           s01401 */1402TEST(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    t11446 *     (ew) \  / (p)1447 *           e01448 *            | (lt)1449 *           e11450 *            | (et)1451 *           s01452 */1453TEST(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    t11497 *     (ew) \  / (p)1498 *           e01499 *            | (et)1500 *           e11501 *            | (lt)1502 *           s01503 */1504TEST(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    t11548 *     (ew) \  / (p)1549 *           e01550 *            | (et)1551 *           e11552 *            | (et)1553 *           s01554 */1555TEST(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   t11599 *    (ew) |    | (ew)1600 *         |   e01601 *          \  / (lt)1602 *           e11603 *            | (lt)1604 *           s01605 */1606TEST(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   t11651 *    (ew) |    | (ew)1652 *         |   e01653 *          \  / (lt)1654 *           e11655 *            | (et)1656 *           s01657 */1658TEST(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   t11703 *    (ew) |    | (ew)1704 *         |   e01705 *          \  / (et)1706 *           e11707 *            | (lt)1708 *           s01709 */1710TEST(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   t11755 *    (ew) |    | (ew)1756 *         |   e01757 *          \  / (et)1758 *           e11759 *            | (et)1760 *           s01761 */1762TEST(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   t11807 *     (p) |    | (ew)1808 *         |   e01809 *          \  / (lt)1810 *           e11811 *            | (lt)1812 *           s01813 */1814TEST(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   t11864 *     (p) |    | (ew)1865 *         |   e01866 *          \  / (lt)1867 *           e11868 *            | (et)1869 *           s01870 */1871TEST(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   t11921 *     (p) |    | (ew)1922 *         |   e01923 *          \  / (et)1924 *           e11925 *            | (lt)1926 *           s01927 */1928TEST(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   t11978 *     (p) |    | (ew)1979 *         |   e01980 *          \  / (et)1981 *           e11982 *            | (et)1983 *           s01984 */1985TEST(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   t12035 *    (ew) |    | (p)2036 *         |   e02037 *          \  / (lt)2038 *           e12039 *            | (lt)2040 *           s02041 */2042TEST(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   t12087 *    (ew) |    | (p)2088 *         |   e02089 *          \  / (lt)2090 *           e12091 *            | (et)2092 *           s02093 */2094TEST(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   t12139 *    (ew) |    | (p)2140 *         |   e02141 *          \  / (et)2142 *           e12143 *            | (lt)2144 *           s02145 */2146TEST(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   t12191 *    (ew) |    | (p)2192 *         |   e02193 *          \  / (et)2194 *           e12195 *            | (et)2196 *           s02197 */2198TEST(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   t12243 *     (p) |    | (p)2244 *         |   e02245 *          \  / (lt)2246 *           e12247 *            | (lt)2248 *           s02249 */2250TEST(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   t12300 *     (p) |    | (p)2301 *         |   e02302 *          \  / (lt)2303 *           e12304 *            | (et)2305 *           s02306 */2307TEST(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   t12352 *     (p) |    | (p)2353 *         |   e02354 *          \  / (et)2355 *           e12356 *            | (lt)2357 *           s02358 */2359TEST(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   t12409 *     (p) |    | (p)2410 *         |   e02411 *          \  / (et)2412 *           e12413 *            | (et)2414 *           s02415 */2416TEST(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 *           t02461 *            | (ew)2462 *           e02463 *     (lt) /  \ (lt)2464 *        e1    e22465 *    (lt) |     | (lt)2466 *        s0    s22467 */2468TEST(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 *           t02515 *            | (ew)2516 *           e02517 *     (et) /  \ (et)2518 *        e1    e22519 *    (lt) |     | (lt)2520 *        s0    s22521 */2522TEST(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 *           t02569 *            | (p)2570 *           e02571 *     (lt) /  \ (lt)2572 *        e1    e22573 *    (lt) |     | (lt)2574 *        s0    s22575 */2576TEST(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 *           t02631 *            | (p)2632 *           e02633 *     (et) /  \ (et)2634 *        e1    e22635 *    (lt) |     | (lt)2636 *        s0    s22637 */2638TEST(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    t12693 *     (ew) \  / (ew)2694 *           e02695 *     (lt) /  \ (lt)2696 *        e1    e22697 *    (lt) |     | (lt)2698 *        s0    s22699 */2700TEST(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    t12758 *     (ew) \  / (ew)2759 *           e02760 *     (et) /  \ (et)2761 *        e1    e22762 *    (lt) |     | (lt)2763 *        s0    s22764 */2765TEST(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    t12823 *     (ew) \  / (p)2824 *           e02825 *     (lt) /  \ (lt)2826 *        e1    e22827 *    (lt) |     | (lt)2828 *        s0    s22829 */2830TEST(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    t12888 *     (ew) \  / (p)2889 *           e02890 *     (et) /  \ (et)2891 *        e1    e22892 *    (lt) |     | (lt)2893 *        s0    s22894 */2895TEST(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    t12953 *      (p) \  / (p)2954 *           e02955 *     (lt) /  \ (lt)2956 *        e1    e22957 *    (lt) |     | (lt)2958 *        s0    s22959 */2960TEST(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    t13023 *      (p) \  / (p)3024 *           e03025 *     (et) /  \ (et)3026 *        e1    e23027 *    (lt) |     | (lt)3028 *        s0    s23029 */3030TEST(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 3091static 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 *        t03111 *      (p) \3112 *           e03113 *     (et) /3114 *        e03115 *3116 * Based on https://bugzilla.kernel.org/show_bug.cgi?id=2059333117 */3118TEST(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 3155enum {3156	EPOLL60_EVENTS_NR = 10,3157};3158 3159struct epoll60_ctx {3160	volatile int stopped;3161	int ready;3162	int waiters;3163	int epfd;3164	int evfd[EPOLL60_EVENTS_NR];3165};3166 3167static 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 3212static 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 3224static inline int count_waiters(struct epoll60_ctx *ctx)3225{3226	return __atomic_load_n(&ctx->waiters, __ATOMIC_ACQUIRE);3227}3228 3229TEST(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 3300struct epoll61_ctx {3301	int epfd;3302	int evfd;3303};3304 3305static 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 3315static 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 the3324	 * 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 3334static 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 3343TEST(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 it3361	 * 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 23374		 * or Thread 3.  If it wakes up Thread 2, Thread 2 writes on the3375		 * eventfd to wake up Thread 3.3376		 *3377		 * If no events are missed, all three threads should eventually3378		 * 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. */3396TEST(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. */3421TEST(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    t13454 *     (ew) \  / (ew)3455 *           e03456 *            | (lt)3457 *           s03458 */3459TEST(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 are3477	 * 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 3496TEST_HARNESS_MAIN3497