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