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