Linux Audio

Check our new training course

Yocto distribution development and maintenance

Need a Yocto distribution for your embedded project?
Loading...
   1// SPDX-License-Identifier: GPL-2.0
   2
   3#define _GNU_SOURCE
   4#include <asm/unistd.h>
   5#include <linux/time_types.h>
   6#include <poll.h>
   7#include <unistd.h>
   8#include <assert.h>
   9#include <signal.h>
  10#include <pthread.h>
  11#include <sys/epoll.h>
  12#include <sys/socket.h>
  13#include <sys/eventfd.h>
  14#include "../../kselftest_harness.h"
  15
  16struct epoll_mtcontext
  17{
  18	int efd[3];
  19	int sfd[4];
  20	volatile int count;
  21
  22	pthread_t main;
  23	pthread_t waiter;
  24};
  25
  26#ifndef __NR_epoll_pwait2
  27#define __NR_epoll_pwait2 -1
  28#endif
  29
  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 *          t0
 158 *           | (ew)
 159 *          e0
 160 *           | (lt)
 161 *          s0
 162 */
 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 *          t0
 189 *           | (ew)
 190 *          e0
 191 *           | (et)
 192 *          s0
 193 */
 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 *           t0
 220 *            | (ew)
 221 *           e0
 222 *     (lt) /  \ (lt)
 223 *        s0    s2
 224 */
 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 *           t0
 258 *            | (ew)
 259 *           e0
 260 *     (et) /  \ (et)
 261 *        s0    s2
 262 */
 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 *          t0
 296 *           | (p)
 297 *          e0
 298 *           | (lt)
 299 *          s0
 300 */
 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 *          t0
 335 *           | (p)
 336 *          e0
 337 *           | (et)
 338 *          s0
 339 */
 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 *           t0
 374 *            | (p)
 375 *           e0
 376 *     (lt) /  \ (lt)
 377 *        s0    s2
 378 */
 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 *           t0
 421 *            | (p)
 422 *           e0
 423 *     (et) /  \ (et)
 424 *        s0    s2
 425 */
 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    t1
 467 *     (ew) \  / (ew)
 468 *           e0
 469 *            | (lt)
 470 *           s0
 471 */
 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    t1
 510 *     (ew) \  / (ew)
 511 *           e0
 512 *            | (et)
 513 *           s0
 514 */
 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    t1
 553 *     (ew) \  / (ew)
 554 *           e0
 555 *     (lt) /  \ (lt)
 556 *        s0    s2
 557 */
 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    t1
 602 *     (ew) \  / (ew)
 603 *           e0
 604 *     (et) /  \ (et)
 605 *        s0    s2
 606 */
 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    t1
 651 *     (ew) \  / (p)
 652 *           e0
 653 *            | (lt)
 654 *           s0
 655 */
 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    t1
 694 *     (ew) \  / (p)
 695 *           e0
 696 *            | (et)
 697 *           s0
 698 */
 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    t1
 737 *     (ew) \  / (p)
 738 *           e0
 739 *     (lt) /  \ (lt)
 740 *        s0    s2
 741 */
 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    t1
 786 *     (ew) \  / (p)
 787 *           e0
 788 *     (et) /  \ (et)
 789 *        s0    s2
 790 */
 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 *          t0
 835 *           | (ew)
 836 *          e0
 837 *           | (lt)
 838 *          e1
 839 *           | (lt)
 840 *          s0
 841 */
 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 *          t0
 875 *           | (ew)
 876 *          e0
 877 *           | (lt)
 878 *          e1
 879 *           | (et)
 880 *          s0
 881 */
 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 *           t0
 915 *            | (ew)
 916 *           e0
 917 *            | (et)
 918 *           e1
 919 *            | (lt)
 920 *           s0
 921 */
 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 *           t0
 955 *            | (ew)
 956 *           e0
 957 *            | (et)
 958 *           e1
 959 *            | (et)
 960 *           s0
 961 */
 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 *          t0
 995 *           | (p)
 996 *          e0
 997 *           | (lt)
 998 *          e1
 999 *           | (lt)
1000 *          s0
1001 */
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 *          t0
1043 *           | (p)
1044 *          e0
1045 *           | (lt)
1046 *          e1
1047 *           | (et)
1048 *          s0
1049 */
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 *          t0
1091 *           | (p)
1092 *          e0
1093 *           | (et)
1094 *          e1
1095 *           | (lt)
1096 *          s0
1097 */
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 *          t0
1139 *           | (p)
1140 *          e0
1141 *           | (et)
1142 *          e1
1143 *           | (et)
1144 *          s0
1145 */
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    t1
1187 *     (ew) \  / (ew)
1188 *           e0
1189 *            | (lt)
1190 *           e1
1191 *            | (lt)
1192 *           s0
1193 */
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    t1
1239 *     (ew) \  / (ew)
1240 *           e0
1241 *            | (lt)
1242 *           e1
1243 *            | (et)
1244 *           s0
1245 */
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    t1
1291 *     (ew) \  / (ew)
1292 *           e0
1293 *            | (et)
1294 *           e1
1295 *            | (lt)
1296 *           s0
1297 */
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    t1
1343 *     (ew) \  / (ew)
1344 *           e0
1345 *            | (et)
1346 *           e1
1347 *            | (et)
1348 *           s0
1349 */
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    t1
1395 *     (ew) \  / (p)
1396 *           e0
1397 *            | (lt)
1398 *           e1
1399 *            | (lt)
1400 *           s0
1401 */
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    t1
1446 *     (ew) \  / (p)
1447 *           e0
1448 *            | (lt)
1449 *           e1
1450 *            | (et)
1451 *           s0
1452 */
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    t1
1497 *     (ew) \  / (p)
1498 *           e0
1499 *            | (et)
1500 *           e1
1501 *            | (lt)
1502 *           s0
1503 */
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    t1
1548 *     (ew) \  / (p)
1549 *           e0
1550 *            | (et)
1551 *           e1
1552 *            | (et)
1553 *           s0
1554 */
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   t1
1599 *    (ew) |    | (ew)
1600 *         |   e0
1601 *          \  / (lt)
1602 *           e1
1603 *            | (lt)
1604 *           s0
1605 */
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   t1
1651 *    (ew) |    | (ew)
1652 *         |   e0
1653 *          \  / (lt)
1654 *           e1
1655 *            | (et)
1656 *           s0
1657 */
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   t1
1703 *    (ew) |    | (ew)
1704 *         |   e0
1705 *          \  / (et)
1706 *           e1
1707 *            | (lt)
1708 *           s0
1709 */
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   t1
1755 *    (ew) |    | (ew)
1756 *         |   e0
1757 *          \  / (et)
1758 *           e1
1759 *            | (et)
1760 *           s0
1761 */
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   t1
1807 *     (p) |    | (ew)
1808 *         |   e0
1809 *          \  / (lt)
1810 *           e1
1811 *            | (lt)
1812 *           s0
1813 */
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   t1
1864 *     (p) |    | (ew)
1865 *         |   e0
1866 *          \  / (lt)
1867 *           e1
1868 *            | (et)
1869 *           s0
1870 */
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   t1
1921 *     (p) |    | (ew)
1922 *         |   e0
1923 *          \  / (et)
1924 *           e1
1925 *            | (lt)
1926 *           s0
1927 */
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   t1
1978 *     (p) |    | (ew)
1979 *         |   e0
1980 *          \  / (et)
1981 *           e1
1982 *            | (et)
1983 *           s0
1984 */
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   t1
2035 *    (ew) |    | (p)
2036 *         |   e0
2037 *          \  / (lt)
2038 *           e1
2039 *            | (lt)
2040 *           s0
2041 */
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   t1
2087 *    (ew) |    | (p)
2088 *         |   e0
2089 *          \  / (lt)
2090 *           e1
2091 *            | (et)
2092 *           s0
2093 */
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   t1
2139 *    (ew) |    | (p)
2140 *         |   e0
2141 *          \  / (et)
2142 *           e1
2143 *            | (lt)
2144 *           s0
2145 */
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   t1
2191 *    (ew) |    | (p)
2192 *         |   e0
2193 *          \  / (et)
2194 *           e1
2195 *            | (et)
2196 *           s0
2197 */
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   t1
2243 *     (p) |    | (p)
2244 *         |   e0
2245 *          \  / (lt)
2246 *           e1
2247 *            | (lt)
2248 *           s0
2249 */
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   t1
2300 *     (p) |    | (p)
2301 *         |   e0
2302 *          \  / (lt)
2303 *           e1
2304 *            | (et)
2305 *           s0
2306 */
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   t1
2352 *     (p) |    | (p)
2353 *         |   e0
2354 *          \  / (et)
2355 *           e1
2356 *            | (lt)
2357 *           s0
2358 */
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   t1
2409 *     (p) |    | (p)
2410 *         |   e0
2411 *          \  / (et)
2412 *           e1
2413 *            | (et)
2414 *           s0
2415 */
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 *           t0
2461 *            | (ew)
2462 *           e0
2463 *     (lt) /  \ (lt)
2464 *        e1    e2
2465 *    (lt) |     | (lt)
2466 *        s0    s2
2467 */
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 *           t0
2515 *            | (ew)
2516 *           e0
2517 *     (et) /  \ (et)
2518 *        e1    e2
2519 *    (lt) |     | (lt)
2520 *        s0    s2
2521 */
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 *           t0
2569 *            | (p)
2570 *           e0
2571 *     (lt) /  \ (lt)
2572 *        e1    e2
2573 *    (lt) |     | (lt)
2574 *        s0    s2
2575 */
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 *           t0
2631 *            | (p)
2632 *           e0
2633 *     (et) /  \ (et)
2634 *        e1    e2
2635 *    (lt) |     | (lt)
2636 *        s0    s2
2637 */
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    t1
2693 *     (ew) \  / (ew)
2694 *           e0
2695 *     (lt) /  \ (lt)
2696 *        e1    e2
2697 *    (lt) |     | (lt)
2698 *        s0    s2
2699 */
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    t1
2758 *     (ew) \  / (ew)
2759 *           e0
2760 *     (et) /  \ (et)
2761 *        e1    e2
2762 *    (lt) |     | (lt)
2763 *        s0    s2
2764 */
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    t1
2823 *     (ew) \  / (p)
2824 *           e0
2825 *     (lt) /  \ (lt)
2826 *        e1    e2
2827 *    (lt) |     | (lt)
2828 *        s0    s2
2829 */
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    t1
2888 *     (ew) \  / (p)
2889 *           e0
2890 *     (et) /  \ (et)
2891 *        e1    e2
2892 *    (lt) |     | (lt)
2893 *        s0    s2
2894 */
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    t1
2953 *      (p) \  / (p)
2954 *           e0
2955 *     (lt) /  \ (lt)
2956 *        e1    e2
2957 *    (lt) |     | (lt)
2958 *        s0    s2
2959 */
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    t1
3023 *      (p) \  / (p)
3024 *           e0
3025 *     (et) /  \ (et)
3026 *        e1    e2
3027 *    (lt) |     | (lt)
3028 *        s0    s2
3029 */
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 *        t0
3111 *      (p) \
3112 *           e0
3113 *     (et) /
3114 *        e0
3115 *
3116 * Based on https://bugzilla.kernel.org/show_bug.cgi?id=205933
3117 */
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 the
3324	 * blocking poller.
3325	 */
3326	if (n == 1) {
3327		int64_t l = 1;
3328
3329		write(ctx->evfd, &l, sizeof(l));
3330	}
3331	return NULL;
3332}
3333
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 it
3361	 * more likely to fail in case of a bug.
3362	 */
3363	for (i = 0; i < 1000; i++) {
3364		pthread_t threads[3];
3365		int n;
3366
3367		/*
3368		 * Start 3 threads:
3369		 * Thread 1 sleeps for 10.9ms and writes to the evenfd.
3370		 * Thread 2 calls epoll with a timeout of 11ms.
3371		 * Thread 3 calls epoll with a timeout of -1.
3372		 *
3373		 * The eventfd write by Thread 1 should either wakeup Thread 2
3374		 * or Thread 3.  If it wakes up Thread 2, Thread 2 writes on the
3375		 * eventfd to wake up Thread 3.
3376		 *
3377		 * If no events are missed, all three threads should eventually
3378		 * be joinable.
3379		 */
3380		ASSERT_EQ(pthread_create(&threads[0], NULL,
3381					 epoll61_write_eventfd, &ctx), 0);
3382		ASSERT_EQ(pthread_create(&threads[1], NULL,
3383					 epoll61_epoll_with_timeout, &ctx), 0);
3384		ASSERT_EQ(pthread_create(&threads[2], NULL,
3385					 epoll61_blocking_epoll, &ctx), 0);
3386
3387		for (n = 0; n < ARRAY_SIZE(threads); ++n)
3388			ASSERT_EQ(pthread_join(threads[n], NULL), 0);
3389	}
3390
3391	close(ctx.epfd);
3392	close(ctx.evfd);
3393}
3394
3395/* Equivalent to basic test epoll1, but exercising epoll_pwait2. */
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    t1
3454 *     (ew) \  / (ew)
3455 *           e0
3456 *            | (lt)
3457 *           s0
3458 */
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 are
3477	 * blocked and expects to both be awoken upon the ready event.
3478	 */
3479	ctx.main = pthread_self();
3480	ASSERT_EQ(pthread_create(&waiter[0], NULL, waiter_entry1a, &ctx), 0);
3481	ASSERT_EQ(pthread_create(&waiter[1], NULL, waiter_entry1a, &ctx), 0);
3482
3483	usleep(100000);
3484	ASSERT_EQ(write(ctx.sfd[1], "w", 1), 1);
3485
3486	ASSERT_EQ(pthread_join(waiter[0], NULL), 0);
3487	ASSERT_EQ(pthread_join(waiter[1], NULL), 0);
3488
3489	EXPECT_EQ(ctx.count, 2);
3490
3491	close(ctx.efd[0]);
3492	close(ctx.sfd[0]);
3493	close(ctx.sfd[1]);
3494}
3495
3496TEST_HARNESS_MAIN
1