Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: add epoll selftests

This adds the promised selftest for epoll. It will verify the wakeups
of epoll. Including leaf and nested mode, epoll_wait() and poll() and
multi-threads.

Link: http://lkml.kernel.org/r/20191009121518.4027-1-r@hev.cc
Signed-off-by: hev <r@hev.cc>
Reviewed-by: Roman Penyaev <rpenyaev@suse.de>
Cc: Jason Baron <jbaron@akamai.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Heiher and committed by
Linus Torvalds
f2728fe8 339ddb53

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