Path: blob/master/tools/testing/selftests/filesystems/epoll/epoll_wakeup_test.c
26302 views
// SPDX-License-Identifier: GPL-2.012#define _GNU_SOURCE3#include <asm/unistd.h>4#include <linux/time_types.h>5#include <poll.h>6#include <unistd.h>7#include <assert.h>8#include <signal.h>9#include <pthread.h>10#include <sys/epoll.h>11#include <sys/socket.h>12#include <sys/eventfd.h>13#include "../../kselftest_harness.h"1415struct epoll_mtcontext16{17int efd[3];18int sfd[4];19volatile int count;2021pthread_t main;22pthread_t waiter;23};2425#ifndef __NR_epoll_pwait226#define __NR_epoll_pwait2 -127#endif2829static inline int sys_epoll_pwait2(int fd, struct epoll_event *events,30int maxevents,31const struct __kernel_timespec *timeout,32const sigset_t *sigset, size_t sigsetsize)33{34return syscall(__NR_epoll_pwait2, fd, events, maxevents, timeout,35sigset, sigsetsize);36}3738static void signal_handler(int signum)39{40}4142static void kill_timeout(struct epoll_mtcontext *ctx)43{44usleep(1000000);45pthread_kill(ctx->main, SIGUSR1);46pthread_kill(ctx->waiter, SIGUSR1);47}4849static void *waiter_entry1a(void *data)50{51struct epoll_event e;52struct epoll_mtcontext *ctx = data;5354if (epoll_wait(ctx->efd[0], &e, 1, -1) > 0)55__sync_fetch_and_add(&ctx->count, 1);5657return NULL;58}5960static void *waiter_entry1ap(void *data)61{62struct pollfd pfd;63struct epoll_event e;64struct epoll_mtcontext *ctx = data;6566pfd.fd = ctx->efd[0];67pfd.events = POLLIN;68if (poll(&pfd, 1, -1) > 0) {69if (epoll_wait(ctx->efd[0], &e, 1, 0) > 0)70__sync_fetch_and_add(&ctx->count, 1);71}7273return NULL;74}7576static void *waiter_entry1o(void *data)77{78struct epoll_event e;79struct epoll_mtcontext *ctx = data;8081if (epoll_wait(ctx->efd[0], &e, 1, -1) > 0)82__sync_fetch_and_or(&ctx->count, 1);8384return NULL;85}8687static void *waiter_entry1op(void *data)88{89struct pollfd pfd;90struct epoll_event e;91struct epoll_mtcontext *ctx = data;9293pfd.fd = ctx->efd[0];94pfd.events = POLLIN;95if (poll(&pfd, 1, -1) > 0) {96if (epoll_wait(ctx->efd[0], &e, 1, 0) > 0)97__sync_fetch_and_or(&ctx->count, 1);98}99100return NULL;101}102103static void *waiter_entry2a(void *data)104{105struct epoll_event events[2];106struct epoll_mtcontext *ctx = data;107108if (epoll_wait(ctx->efd[0], events, 2, -1) > 0)109__sync_fetch_and_add(&ctx->count, 1);110111return NULL;112}113114static void *waiter_entry2ap(void *data)115{116struct pollfd pfd;117struct epoll_event events[2];118struct epoll_mtcontext *ctx = data;119120pfd.fd = ctx->efd[0];121pfd.events = POLLIN;122if (poll(&pfd, 1, -1) > 0) {123if (epoll_wait(ctx->efd[0], events, 2, 0) > 0)124__sync_fetch_and_add(&ctx->count, 1);125}126127return NULL;128}129130static void *emitter_entry1(void *data)131{132struct epoll_mtcontext *ctx = data;133134usleep(100000);135write(ctx->sfd[1], "w", 1);136137kill_timeout(ctx);138139return NULL;140}141142static void *emitter_entry2(void *data)143{144struct epoll_mtcontext *ctx = data;145146usleep(100000);147write(ctx->sfd[1], "w", 1);148write(ctx->sfd[3], "w", 1);149150kill_timeout(ctx);151152return NULL;153}154155/*156* t0157* | (ew)158* e0159* | (lt)160* s0161*/162TEST(epoll1)163{164int efd;165int sfd[2];166struct epoll_event e;167168ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);169170efd = epoll_create(1);171ASSERT_GE(efd, 0);172173e.events = EPOLLIN;174ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);175176ASSERT_EQ(write(sfd[1], "w", 1), 1);177178EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 1);179EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 1);180181close(efd);182close(sfd[0]);183close(sfd[1]);184}185186/*187* t0188* | (ew)189* e0190* | (et)191* s0192*/193TEST(epoll2)194{195int efd;196int sfd[2];197struct epoll_event e;198199ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);200201efd = epoll_create(1);202ASSERT_GE(efd, 0);203204e.events = EPOLLIN | EPOLLET;205ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);206207ASSERT_EQ(write(sfd[1], "w", 1), 1);208209EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 1);210EXPECT_EQ(epoll_wait(efd, &e, 1, 0), 0);211212close(efd);213close(sfd[0]);214close(sfd[1]);215}216217/*218* t0219* | (ew)220* e0221* (lt) / \ (lt)222* s0 s2223*/224TEST(epoll3)225{226int efd;227int sfd[4];228struct epoll_event events[2];229230ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);231ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);232233efd = epoll_create(1);234ASSERT_GE(efd, 0);235236events[0].events = EPOLLIN;237ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);238239events[0].events = EPOLLIN;240ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);241242ASSERT_EQ(write(sfd[1], "w", 1), 1);243ASSERT_EQ(write(sfd[3], "w", 1), 1);244245EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);246EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);247248close(efd);249close(sfd[0]);250close(sfd[1]);251close(sfd[2]);252close(sfd[3]);253}254255/*256* t0257* | (ew)258* e0259* (et) / \ (et)260* s0 s2261*/262TEST(epoll4)263{264int efd;265int sfd[4];266struct epoll_event events[2];267268ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);269ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);270271efd = epoll_create(1);272ASSERT_GE(efd, 0);273274events[0].events = EPOLLIN | EPOLLET;275ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);276277events[0].events = EPOLLIN | EPOLLET;278ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);279280ASSERT_EQ(write(sfd[1], "w", 1), 1);281ASSERT_EQ(write(sfd[3], "w", 1), 1);282283EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);284EXPECT_EQ(epoll_wait(efd, events, 2, 0), 0);285286close(efd);287close(sfd[0]);288close(sfd[1]);289close(sfd[2]);290close(sfd[3]);291}292293/*294* t0295* | (p)296* e0297* | (lt)298* s0299*/300TEST(epoll5)301{302int efd;303int sfd[2];304struct pollfd pfd;305struct epoll_event e;306307ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);308309efd = epoll_create(1);310ASSERT_GE(efd, 0);311312e.events = EPOLLIN;313ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);314315ASSERT_EQ(write(sfd[1], "w", 1), 1);316317pfd.fd = efd;318pfd.events = POLLIN;319ASSERT_EQ(poll(&pfd, 1, 0), 1);320ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 1);321322pfd.fd = efd;323pfd.events = POLLIN;324ASSERT_EQ(poll(&pfd, 1, 0), 1);325ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 1);326327close(efd);328close(sfd[0]);329close(sfd[1]);330}331332/*333* t0334* | (p)335* e0336* | (et)337* s0338*/339TEST(epoll6)340{341int efd;342int sfd[2];343struct pollfd pfd;344struct epoll_event e;345346ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);347348efd = epoll_create(1);349ASSERT_GE(efd, 0);350351e.events = EPOLLIN | EPOLLET;352ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);353354ASSERT_EQ(write(sfd[1], "w", 1), 1);355356pfd.fd = efd;357pfd.events = POLLIN;358ASSERT_EQ(poll(&pfd, 1, 0), 1);359ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 1);360361pfd.fd = efd;362pfd.events = POLLIN;363ASSERT_EQ(poll(&pfd, 1, 0), 0);364ASSERT_EQ(epoll_wait(efd, &e, 1, 0), 0);365366close(efd);367close(sfd[0]);368close(sfd[1]);369}370371/*372* t0373* | (p)374* e0375* (lt) / \ (lt)376* s0 s2377*/378379TEST(epoll7)380{381int efd;382int sfd[4];383struct pollfd pfd;384struct epoll_event events[2];385386ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);387ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);388389efd = epoll_create(1);390ASSERT_GE(efd, 0);391392events[0].events = EPOLLIN;393ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);394395events[0].events = EPOLLIN;396ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);397398ASSERT_EQ(write(sfd[1], "w", 1), 1);399ASSERT_EQ(write(sfd[3], "w", 1), 1);400401pfd.fd = efd;402pfd.events = POLLIN;403EXPECT_EQ(poll(&pfd, 1, 0), 1);404EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);405406pfd.fd = efd;407pfd.events = POLLIN;408EXPECT_EQ(poll(&pfd, 1, 0), 1);409EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);410411close(efd);412close(sfd[0]);413close(sfd[1]);414close(sfd[2]);415close(sfd[3]);416}417418/*419* t0420* | (p)421* e0422* (et) / \ (et)423* s0 s2424*/425TEST(epoll8)426{427int efd;428int sfd[4];429struct pollfd pfd;430struct epoll_event events[2];431432ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);433ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);434435efd = epoll_create(1);436ASSERT_GE(efd, 0);437438events[0].events = EPOLLIN | EPOLLET;439ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], events), 0);440441events[0].events = EPOLLIN | EPOLLET;442ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[2], events), 0);443444ASSERT_EQ(write(sfd[1], "w", 1), 1);445ASSERT_EQ(write(sfd[3], "w", 1), 1);446447pfd.fd = efd;448pfd.events = POLLIN;449EXPECT_EQ(poll(&pfd, 1, 0), 1);450EXPECT_EQ(epoll_wait(efd, events, 2, 0), 2);451452pfd.fd = efd;453pfd.events = POLLIN;454EXPECT_EQ(poll(&pfd, 1, 0), 0);455EXPECT_EQ(epoll_wait(efd, events, 2, 0), 0);456457close(efd);458close(sfd[0]);459close(sfd[1]);460close(sfd[2]);461close(sfd[3]);462}463464/*465* t0 t1466* (ew) \ / (ew)467* e0468* | (lt)469* s0470*/471TEST(epoll9)472{473pthread_t emitter;474struct epoll_event e;475struct epoll_mtcontext ctx = { 0 };476477signal(SIGUSR1, signal_handler);478479ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);480481ctx.efd[0] = epoll_create(1);482ASSERT_GE(ctx.efd[0], 0);483484e.events = EPOLLIN;485ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);486487ctx.main = pthread_self();488ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);489ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);490491if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)492__sync_fetch_and_add(&ctx.count, 1);493494ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);495EXPECT_EQ(ctx.count, 2);496497if (pthread_tryjoin_np(emitter, NULL) < 0) {498pthread_kill(emitter, SIGUSR1);499pthread_join(emitter, NULL);500}501502close(ctx.efd[0]);503close(ctx.sfd[0]);504close(ctx.sfd[1]);505}506507/*508* t0 t1509* (ew) \ / (ew)510* e0511* | (et)512* s0513*/514TEST(epoll10)515{516pthread_t emitter;517struct epoll_event e;518struct epoll_mtcontext ctx = { 0 };519520signal(SIGUSR1, signal_handler);521522ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);523524ctx.efd[0] = epoll_create(1);525ASSERT_GE(ctx.efd[0], 0);526527e.events = EPOLLIN | EPOLLET;528ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);529530ctx.main = pthread_self();531ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);532ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);533534if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)535__sync_fetch_and_add(&ctx.count, 1);536537ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);538EXPECT_EQ(ctx.count, 1);539540if (pthread_tryjoin_np(emitter, NULL) < 0) {541pthread_kill(emitter, SIGUSR1);542pthread_join(emitter, NULL);543}544545close(ctx.efd[0]);546close(ctx.sfd[0]);547close(ctx.sfd[1]);548}549550/*551* t0 t1552* (ew) \ / (ew)553* e0554* (lt) / \ (lt)555* s0 s2556*/557TEST(epoll11)558{559pthread_t emitter;560struct epoll_event events[2];561struct epoll_mtcontext ctx = { 0 };562563signal(SIGUSR1, signal_handler);564565ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);566ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);567568ctx.efd[0] = epoll_create(1);569ASSERT_GE(ctx.efd[0], 0);570571events[0].events = EPOLLIN;572ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);573574events[0].events = EPOLLIN;575ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);576577ctx.main = pthread_self();578ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry2a, &ctx), 0);579ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);580581if (epoll_wait(ctx.efd[0], events, 2, -1) > 0)582__sync_fetch_and_add(&ctx.count, 1);583584ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);585EXPECT_EQ(ctx.count, 2);586587if (pthread_tryjoin_np(emitter, NULL) < 0) {588pthread_kill(emitter, SIGUSR1);589pthread_join(emitter, NULL);590}591592close(ctx.efd[0]);593close(ctx.sfd[0]);594close(ctx.sfd[1]);595close(ctx.sfd[2]);596close(ctx.sfd[3]);597}598599/*600* t0 t1601* (ew) \ / (ew)602* e0603* (et) / \ (et)604* s0 s2605*/606TEST(epoll12)607{608pthread_t emitter;609struct epoll_event events[2];610struct epoll_mtcontext ctx = { 0 };611612signal(SIGUSR1, signal_handler);613614ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);615ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);616617ctx.efd[0] = epoll_create(1);618ASSERT_GE(ctx.efd[0], 0);619620events[0].events = EPOLLIN | EPOLLET;621ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);622623events[0].events = EPOLLIN | EPOLLET;624ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);625626ctx.main = pthread_self();627ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);628ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);629630if (epoll_wait(ctx.efd[0], events, 1, -1) > 0)631__sync_fetch_and_add(&ctx.count, 1);632633ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);634EXPECT_EQ(ctx.count, 2);635636if (pthread_tryjoin_np(emitter, NULL) < 0) {637pthread_kill(emitter, SIGUSR1);638pthread_join(emitter, NULL);639}640641close(ctx.efd[0]);642close(ctx.sfd[0]);643close(ctx.sfd[1]);644close(ctx.sfd[2]);645close(ctx.sfd[3]);646}647648/*649* t0 t1650* (ew) \ / (p)651* e0652* | (lt)653* s0654*/655TEST(epoll13)656{657pthread_t emitter;658struct epoll_event e;659struct epoll_mtcontext ctx = { 0 };660661signal(SIGUSR1, signal_handler);662663ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);664665ctx.efd[0] = epoll_create(1);666ASSERT_GE(ctx.efd[0], 0);667668e.events = EPOLLIN;669ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);670671ctx.main = pthread_self();672ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);673ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);674675if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)676__sync_fetch_and_add(&ctx.count, 1);677678ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);679EXPECT_EQ(ctx.count, 2);680681if (pthread_tryjoin_np(emitter, NULL) < 0) {682pthread_kill(emitter, SIGUSR1);683pthread_join(emitter, NULL);684}685686close(ctx.efd[0]);687close(ctx.sfd[0]);688close(ctx.sfd[1]);689}690691/*692* t0 t1693* (ew) \ / (p)694* e0695* | (et)696* s0697*/698TEST(epoll14)699{700pthread_t emitter;701struct epoll_event e;702struct epoll_mtcontext ctx = { 0 };703704signal(SIGUSR1, signal_handler);705706ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);707708ctx.efd[0] = epoll_create(1);709ASSERT_GE(ctx.efd[0], 0);710711e.events = EPOLLIN | EPOLLET;712ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);713714ctx.main = pthread_self();715ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);716ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);717718if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)719__sync_fetch_and_add(&ctx.count, 1);720721ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);722EXPECT_EQ(ctx.count, 1);723724if (pthread_tryjoin_np(emitter, NULL) < 0) {725pthread_kill(emitter, SIGUSR1);726pthread_join(emitter, NULL);727}728729close(ctx.efd[0]);730close(ctx.sfd[0]);731close(ctx.sfd[1]);732}733734/*735* t0 t1736* (ew) \ / (p)737* e0738* (lt) / \ (lt)739* s0 s2740*/741TEST(epoll15)742{743pthread_t emitter;744struct epoll_event events[2];745struct epoll_mtcontext ctx = { 0 };746747signal(SIGUSR1, signal_handler);748749ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);750ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);751752ctx.efd[0] = epoll_create(1);753ASSERT_GE(ctx.efd[0], 0);754755events[0].events = EPOLLIN;756ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);757758events[0].events = EPOLLIN;759ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);760761ctx.main = pthread_self();762ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry2ap, &ctx), 0);763ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);764765if (epoll_wait(ctx.efd[0], events, 2, -1) > 0)766__sync_fetch_and_add(&ctx.count, 1);767768ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);769EXPECT_EQ(ctx.count, 2);770771if (pthread_tryjoin_np(emitter, NULL) < 0) {772pthread_kill(emitter, SIGUSR1);773pthread_join(emitter, NULL);774}775776close(ctx.efd[0]);777close(ctx.sfd[0]);778close(ctx.sfd[1]);779close(ctx.sfd[2]);780close(ctx.sfd[3]);781}782783/*784* t0 t1785* (ew) \ / (p)786* e0787* (et) / \ (et)788* s0 s2789*/790TEST(epoll16)791{792pthread_t emitter;793struct epoll_event events[2];794struct epoll_mtcontext ctx = { 0 };795796signal(SIGUSR1, signal_handler);797798ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);799ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);800801ctx.efd[0] = epoll_create(1);802ASSERT_GE(ctx.efd[0], 0);803804events[0].events = EPOLLIN | EPOLLET;805ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], events), 0);806807events[0].events = EPOLLIN | EPOLLET;808ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[2], events), 0);809810ctx.main = pthread_self();811ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);812ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);813814if (epoll_wait(ctx.efd[0], events, 1, -1) > 0)815__sync_fetch_and_add(&ctx.count, 1);816817ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);818EXPECT_EQ(ctx.count, 2);819820if (pthread_tryjoin_np(emitter, NULL) < 0) {821pthread_kill(emitter, SIGUSR1);822pthread_join(emitter, NULL);823}824825close(ctx.efd[0]);826close(ctx.sfd[0]);827close(ctx.sfd[1]);828close(ctx.sfd[2]);829close(ctx.sfd[3]);830}831832/*833* t0834* | (ew)835* e0836* | (lt)837* e1838* | (lt)839* s0840*/841TEST(epoll17)842{843int efd[2];844int sfd[2];845struct epoll_event e;846847ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);848849efd[0] = epoll_create(1);850ASSERT_GE(efd[0], 0);851852efd[1] = epoll_create(1);853ASSERT_GE(efd[1], 0);854855e.events = EPOLLIN;856ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);857858e.events = EPOLLIN;859ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);860861ASSERT_EQ(write(sfd[1], "w", 1), 1);862863EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);864EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);865866close(efd[0]);867close(efd[1]);868close(sfd[0]);869close(sfd[1]);870}871872/*873* t0874* | (ew)875* e0876* | (lt)877* e1878* | (et)879* s0880*/881TEST(epoll18)882{883int efd[2];884int sfd[2];885struct epoll_event e;886887ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);888889efd[0] = epoll_create(1);890ASSERT_GE(efd[0], 0);891892efd[1] = epoll_create(1);893ASSERT_GE(efd[1], 0);894895e.events = EPOLLIN | EPOLLET;896ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);897898e.events = EPOLLIN;899ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);900901ASSERT_EQ(write(sfd[1], "w", 1), 1);902903EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);904EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);905906close(efd[0]);907close(efd[1]);908close(sfd[0]);909close(sfd[1]);910}911912/*913* t0914* | (ew)915* e0916* | (et)917* e1918* | (lt)919* s0920*/921TEST(epoll19)922{923int efd[2];924int sfd[2];925struct epoll_event e;926927ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);928929efd[0] = epoll_create(1);930ASSERT_GE(efd[0], 0);931932efd[1] = epoll_create(1);933ASSERT_GE(efd[1], 0);934935e.events = EPOLLIN;936ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);937938e.events = EPOLLIN | EPOLLET;939ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);940941ASSERT_EQ(write(sfd[1], "w", 1), 1);942943EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);944EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);945946close(efd[0]);947close(efd[1]);948close(sfd[0]);949close(sfd[1]);950}951952/*953* t0954* | (ew)955* e0956* | (et)957* e1958* | (et)959* s0960*/961TEST(epoll20)962{963int efd[2];964int sfd[2];965struct epoll_event e;966967ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);968969efd[0] = epoll_create(1);970ASSERT_GE(efd[0], 0);971972efd[1] = epoll_create(1);973ASSERT_GE(efd[1], 0);974975e.events = EPOLLIN | EPOLLET;976ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);977978e.events = EPOLLIN | EPOLLET;979ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);980981ASSERT_EQ(write(sfd[1], "w", 1), 1);982983EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);984EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);985986close(efd[0]);987close(efd[1]);988close(sfd[0]);989close(sfd[1]);990}991992/*993* t0994* | (p)995* e0996* | (lt)997* e1998* | (lt)999* s01000*/1001TEST(epoll21)1002{1003int efd[2];1004int sfd[2];1005struct pollfd pfd;1006struct epoll_event e;10071008ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);10091010efd[0] = epoll_create(1);1011ASSERT_GE(efd[0], 0);10121013efd[1] = epoll_create(1);1014ASSERT_GE(efd[1], 0);10151016e.events = EPOLLIN;1017ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);10181019e.events = EPOLLIN;1020ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);10211022ASSERT_EQ(write(sfd[1], "w", 1), 1);10231024pfd.fd = efd[0];1025pfd.events = POLLIN;1026EXPECT_EQ(poll(&pfd, 1, 0), 1);1027EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);10281029pfd.fd = efd[0];1030pfd.events = POLLIN;1031EXPECT_EQ(poll(&pfd, 1, 0), 1);1032EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);10331034close(efd[0]);1035close(efd[1]);1036close(sfd[0]);1037close(sfd[1]);1038}10391040/*1041* t01042* | (p)1043* e01044* | (lt)1045* e11046* | (et)1047* s01048*/1049TEST(epoll22)1050{1051int efd[2];1052int sfd[2];1053struct pollfd pfd;1054struct epoll_event e;10551056ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);10571058efd[0] = epoll_create(1);1059ASSERT_GE(efd[0], 0);10601061efd[1] = epoll_create(1);1062ASSERT_GE(efd[1], 0);10631064e.events = EPOLLIN | EPOLLET;1065ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);10661067e.events = EPOLLIN;1068ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);10691070ASSERT_EQ(write(sfd[1], "w", 1), 1);10711072pfd.fd = efd[0];1073pfd.events = POLLIN;1074EXPECT_EQ(poll(&pfd, 1, 0), 1);1075EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);10761077pfd.fd = efd[0];1078pfd.events = POLLIN;1079EXPECT_EQ(poll(&pfd, 1, 0), 1);1080EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);10811082close(efd[0]);1083close(efd[1]);1084close(sfd[0]);1085close(sfd[1]);1086}10871088/*1089* t01090* | (p)1091* e01092* | (et)1093* e11094* | (lt)1095* s01096*/1097TEST(epoll23)1098{1099int efd[2];1100int sfd[2];1101struct pollfd pfd;1102struct epoll_event e;11031104ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);11051106efd[0] = epoll_create(1);1107ASSERT_GE(efd[0], 0);11081109efd[1] = epoll_create(1);1110ASSERT_GE(efd[1], 0);11111112e.events = EPOLLIN;1113ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);11141115e.events = EPOLLIN | EPOLLET;1116ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);11171118ASSERT_EQ(write(sfd[1], "w", 1), 1);11191120pfd.fd = efd[0];1121pfd.events = POLLIN;1122EXPECT_EQ(poll(&pfd, 1, 0), 1);1123EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);11241125pfd.fd = efd[0];1126pfd.events = POLLIN;1127EXPECT_EQ(poll(&pfd, 1, 0), 0);1128EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);11291130close(efd[0]);1131close(efd[1]);1132close(sfd[0]);1133close(sfd[1]);1134}11351136/*1137* t01138* | (p)1139* e01140* | (et)1141* e11142* | (et)1143* s01144*/1145TEST(epoll24)1146{1147int efd[2];1148int sfd[2];1149struct pollfd pfd;1150struct epoll_event e;11511152ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);11531154efd[0] = epoll_create(1);1155ASSERT_GE(efd[0], 0);11561157efd[1] = epoll_create(1);1158ASSERT_GE(efd[1], 0);11591160e.events = EPOLLIN | EPOLLET;1161ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], &e), 0);11621163e.events = EPOLLIN | EPOLLET;1164ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], &e), 0);11651166ASSERT_EQ(write(sfd[1], "w", 1), 1);11671168pfd.fd = efd[0];1169pfd.events = POLLIN;1170EXPECT_EQ(poll(&pfd, 1, 0), 1);1171EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 1);11721173pfd.fd = efd[0];1174pfd.events = POLLIN;1175EXPECT_EQ(poll(&pfd, 1, 0), 0);1176EXPECT_EQ(epoll_wait(efd[0], &e, 1, 0), 0);11771178close(efd[0]);1179close(efd[1]);1180close(sfd[0]);1181close(sfd[1]);1182}11831184/*1185* t0 t11186* (ew) \ / (ew)1187* e01188* | (lt)1189* e11190* | (lt)1191* s01192*/1193TEST(epoll25)1194{1195pthread_t emitter;1196struct epoll_event e;1197struct epoll_mtcontext ctx = { 0 };11981199signal(SIGUSR1, signal_handler);12001201ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);12021203ctx.efd[0] = epoll_create(1);1204ASSERT_GE(ctx.efd[0], 0);12051206ctx.efd[1] = epoll_create(1);1207ASSERT_GE(ctx.efd[1], 0);12081209e.events = EPOLLIN;1210ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);12111212e.events = EPOLLIN;1213ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);12141215ctx.main = pthread_self();1216ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1217ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);12181219if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1220__sync_fetch_and_add(&ctx.count, 1);12211222ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1223EXPECT_EQ(ctx.count, 2);12241225if (pthread_tryjoin_np(emitter, NULL) < 0) {1226pthread_kill(emitter, SIGUSR1);1227pthread_join(emitter, NULL);1228}12291230close(ctx.efd[0]);1231close(ctx.efd[1]);1232close(ctx.sfd[0]);1233close(ctx.sfd[1]);1234}12351236/*1237* t0 t11238* (ew) \ / (ew)1239* e01240* | (lt)1241* e11242* | (et)1243* s01244*/1245TEST(epoll26)1246{1247pthread_t emitter;1248struct epoll_event e;1249struct epoll_mtcontext ctx = { 0 };12501251signal(SIGUSR1, signal_handler);12521253ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);12541255ctx.efd[0] = epoll_create(1);1256ASSERT_GE(ctx.efd[0], 0);12571258ctx.efd[1] = epoll_create(1);1259ASSERT_GE(ctx.efd[1], 0);12601261e.events = EPOLLIN | EPOLLET;1262ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);12631264e.events = EPOLLIN;1265ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);12661267ctx.main = pthread_self();1268ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1269ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);12701271if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1272__sync_fetch_and_add(&ctx.count, 1);12731274ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1275EXPECT_EQ(ctx.count, 2);12761277if (pthread_tryjoin_np(emitter, NULL) < 0) {1278pthread_kill(emitter, SIGUSR1);1279pthread_join(emitter, NULL);1280}12811282close(ctx.efd[0]);1283close(ctx.efd[1]);1284close(ctx.sfd[0]);1285close(ctx.sfd[1]);1286}12871288/*1289* t0 t11290* (ew) \ / (ew)1291* e01292* | (et)1293* e11294* | (lt)1295* s01296*/1297TEST(epoll27)1298{1299pthread_t emitter;1300struct epoll_event e;1301struct epoll_mtcontext ctx = { 0 };13021303signal(SIGUSR1, signal_handler);13041305ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);13061307ctx.efd[0] = epoll_create(1);1308ASSERT_GE(ctx.efd[0], 0);13091310ctx.efd[1] = epoll_create(1);1311ASSERT_GE(ctx.efd[1], 0);13121313e.events = EPOLLIN;1314ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);13151316e.events = EPOLLIN | EPOLLET;1317ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);13181319ctx.main = pthread_self();1320ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1321ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);13221323if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1324__sync_fetch_and_add(&ctx.count, 1);13251326ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1327EXPECT_EQ(ctx.count, 1);13281329if (pthread_tryjoin_np(emitter, NULL) < 0) {1330pthread_kill(emitter, SIGUSR1);1331pthread_join(emitter, NULL);1332}13331334close(ctx.efd[0]);1335close(ctx.efd[1]);1336close(ctx.sfd[0]);1337close(ctx.sfd[1]);1338}13391340/*1341* t0 t11342* (ew) \ / (ew)1343* e01344* | (et)1345* e11346* | (et)1347* s01348*/1349TEST(epoll28)1350{1351pthread_t emitter;1352struct epoll_event e;1353struct epoll_mtcontext ctx = { 0 };13541355signal(SIGUSR1, signal_handler);13561357ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);13581359ctx.efd[0] = epoll_create(1);1360ASSERT_GE(ctx.efd[0], 0);13611362ctx.efd[1] = epoll_create(1);1363ASSERT_GE(ctx.efd[1], 0);13641365e.events = EPOLLIN | EPOLLET;1366ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);13671368e.events = EPOLLIN | EPOLLET;1369ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);13701371ctx.main = pthread_self();1372ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1373ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);13741375if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1376__sync_fetch_and_add(&ctx.count, 1);13771378ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1379EXPECT_EQ(ctx.count, 1);13801381if (pthread_tryjoin_np(emitter, NULL) < 0) {1382pthread_kill(emitter, SIGUSR1);1383pthread_join(emitter, NULL);1384}13851386close(ctx.efd[0]);1387close(ctx.efd[1]);1388close(ctx.sfd[0]);1389close(ctx.sfd[1]);1390}13911392/*1393* t0 t11394* (ew) \ / (p)1395* e01396* | (lt)1397* e11398* | (lt)1399* s01400*/1401TEST(epoll29)1402{1403pthread_t emitter;1404struct epoll_event e;1405struct epoll_mtcontext ctx = { 0 };14061407signal(SIGUSR1, signal_handler);14081409ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);14101411ctx.efd[0] = epoll_create(1);1412ASSERT_GE(ctx.efd[0], 0);14131414ctx.efd[1] = epoll_create(1);1415ASSERT_GE(ctx.efd[1], 0);14161417e.events = EPOLLIN;1418ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);14191420e.events = EPOLLIN;1421ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);14221423ctx.main = pthread_self();1424ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);1425ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);14261427if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1428__sync_fetch_and_add(&ctx.count, 1);14291430ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1431EXPECT_EQ(ctx.count, 2);14321433if (pthread_tryjoin_np(emitter, NULL) < 0) {1434pthread_kill(emitter, SIGUSR1);1435pthread_join(emitter, NULL);1436}14371438close(ctx.efd[0]);1439close(ctx.sfd[0]);1440close(ctx.sfd[1]);1441}14421443/*1444* t0 t11445* (ew) \ / (p)1446* e01447* | (lt)1448* e11449* | (et)1450* s01451*/1452TEST(epoll30)1453{1454pthread_t emitter;1455struct epoll_event e;1456struct epoll_mtcontext ctx = { 0 };14571458signal(SIGUSR1, signal_handler);14591460ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);14611462ctx.efd[0] = epoll_create(1);1463ASSERT_GE(ctx.efd[0], 0);14641465ctx.efd[1] = epoll_create(1);1466ASSERT_GE(ctx.efd[1], 0);14671468e.events = EPOLLIN | EPOLLET;1469ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);14701471e.events = EPOLLIN;1472ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);14731474ctx.main = pthread_self();1475ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);1476ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);14771478if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1479__sync_fetch_and_add(&ctx.count, 1);14801481ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1482EXPECT_EQ(ctx.count, 2);14831484if (pthread_tryjoin_np(emitter, NULL) < 0) {1485pthread_kill(emitter, SIGUSR1);1486pthread_join(emitter, NULL);1487}14881489close(ctx.efd[0]);1490close(ctx.sfd[0]);1491close(ctx.sfd[1]);1492}14931494/*1495* t0 t11496* (ew) \ / (p)1497* e01498* | (et)1499* e11500* | (lt)1501* s01502*/1503TEST(epoll31)1504{1505pthread_t emitter;1506struct epoll_event e;1507struct epoll_mtcontext ctx = { 0 };15081509signal(SIGUSR1, signal_handler);15101511ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);15121513ctx.efd[0] = epoll_create(1);1514ASSERT_GE(ctx.efd[0], 0);15151516ctx.efd[1] = epoll_create(1);1517ASSERT_GE(ctx.efd[1], 0);15181519e.events = EPOLLIN;1520ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);15211522e.events = EPOLLIN | EPOLLET;1523ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);15241525ctx.main = pthread_self();1526ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);1527ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);15281529if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1530__sync_fetch_and_add(&ctx.count, 1);15311532ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1533EXPECT_EQ(ctx.count, 1);15341535if (pthread_tryjoin_np(emitter, NULL) < 0) {1536pthread_kill(emitter, SIGUSR1);1537pthread_join(emitter, NULL);1538}15391540close(ctx.efd[0]);1541close(ctx.sfd[0]);1542close(ctx.sfd[1]);1543}15441545/*1546* t0 t11547* (ew) \ / (p)1548* e01549* | (et)1550* e11551* | (et)1552* s01553*/1554TEST(epoll32)1555{1556pthread_t emitter;1557struct epoll_event e;1558struct epoll_mtcontext ctx = { 0 };15591560signal(SIGUSR1, signal_handler);15611562ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);15631564ctx.efd[0] = epoll_create(1);1565ASSERT_GE(ctx.efd[0], 0);15661567ctx.efd[1] = epoll_create(1);1568ASSERT_GE(ctx.efd[1], 0);15691570e.events = EPOLLIN | EPOLLET;1571ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);15721573e.events = EPOLLIN | EPOLLET;1574ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);15751576ctx.main = pthread_self();1577ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);1578ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);15791580if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)1581__sync_fetch_and_add(&ctx.count, 1);15821583ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1584EXPECT_EQ(ctx.count, 1);15851586if (pthread_tryjoin_np(emitter, NULL) < 0) {1587pthread_kill(emitter, SIGUSR1);1588pthread_join(emitter, NULL);1589}15901591close(ctx.efd[0]);1592close(ctx.sfd[0]);1593close(ctx.sfd[1]);1594}15951596/*1597* t0 t11598* (ew) | | (ew)1599* | e01600* \ / (lt)1601* e11602* | (lt)1603* s01604*/1605TEST(epoll33)1606{1607pthread_t emitter;1608struct epoll_event e;1609struct epoll_mtcontext ctx = { 0 };16101611signal(SIGUSR1, signal_handler);16121613ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);16141615ctx.efd[0] = epoll_create(1);1616ASSERT_GE(ctx.efd[0], 0);16171618ctx.efd[1] = epoll_create(1);1619ASSERT_GE(ctx.efd[1], 0);16201621e.events = EPOLLIN;1622ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);16231624e.events = EPOLLIN;1625ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);16261627ctx.main = pthread_self();1628ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1629ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);16301631if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)1632__sync_fetch_and_add(&ctx.count, 1);16331634ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1635EXPECT_EQ(ctx.count, 2);16361637if (pthread_tryjoin_np(emitter, NULL) < 0) {1638pthread_kill(emitter, SIGUSR1);1639pthread_join(emitter, NULL);1640}16411642close(ctx.efd[0]);1643close(ctx.efd[1]);1644close(ctx.sfd[0]);1645close(ctx.sfd[1]);1646}16471648/*1649* t0 t11650* (ew) | | (ew)1651* | e01652* \ / (lt)1653* e11654* | (et)1655* s01656*/1657TEST(epoll34)1658{1659pthread_t emitter;1660struct epoll_event e;1661struct epoll_mtcontext ctx = { 0 };16621663signal(SIGUSR1, signal_handler);16641665ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);16661667ctx.efd[0] = epoll_create(1);1668ASSERT_GE(ctx.efd[0], 0);16691670ctx.efd[1] = epoll_create(1);1671ASSERT_GE(ctx.efd[1], 0);16721673e.events = EPOLLIN | EPOLLET;1674ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);16751676e.events = EPOLLIN;1677ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);16781679ctx.main = pthread_self();1680ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);1681ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);16821683if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)1684__sync_fetch_and_or(&ctx.count, 2);16851686ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1687EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));16881689if (pthread_tryjoin_np(emitter, NULL) < 0) {1690pthread_kill(emitter, SIGUSR1);1691pthread_join(emitter, NULL);1692}16931694close(ctx.efd[0]);1695close(ctx.efd[1]);1696close(ctx.sfd[0]);1697close(ctx.sfd[1]);1698}16991700/*1701* t0 t11702* (ew) | | (ew)1703* | e01704* \ / (et)1705* e11706* | (lt)1707* s01708*/1709TEST(epoll35)1710{1711pthread_t emitter;1712struct epoll_event e;1713struct epoll_mtcontext ctx = { 0 };17141715signal(SIGUSR1, signal_handler);17161717ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);17181719ctx.efd[0] = epoll_create(1);1720ASSERT_GE(ctx.efd[0], 0);17211722ctx.efd[1] = epoll_create(1);1723ASSERT_GE(ctx.efd[1], 0);17241725e.events = EPOLLIN;1726ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);17271728e.events = EPOLLIN | EPOLLET;1729ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);17301731ctx.main = pthread_self();1732ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1733ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);17341735if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)1736__sync_fetch_and_add(&ctx.count, 1);17371738ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1739EXPECT_EQ(ctx.count, 2);17401741if (pthread_tryjoin_np(emitter, NULL) < 0) {1742pthread_kill(emitter, SIGUSR1);1743pthread_join(emitter, NULL);1744}17451746close(ctx.efd[0]);1747close(ctx.efd[1]);1748close(ctx.sfd[0]);1749close(ctx.sfd[1]);1750}17511752/*1753* t0 t11754* (ew) | | (ew)1755* | e01756* \ / (et)1757* e11758* | (et)1759* s01760*/1761TEST(epoll36)1762{1763pthread_t emitter;1764struct epoll_event e;1765struct epoll_mtcontext ctx = { 0 };17661767signal(SIGUSR1, signal_handler);17681769ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);17701771ctx.efd[0] = epoll_create(1);1772ASSERT_GE(ctx.efd[0], 0);17731774ctx.efd[1] = epoll_create(1);1775ASSERT_GE(ctx.efd[1], 0);17761777e.events = EPOLLIN | EPOLLET;1778ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);17791780e.events = EPOLLIN | EPOLLET;1781ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);17821783ctx.main = pthread_self();1784ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);1785ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);17861787if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)1788__sync_fetch_and_or(&ctx.count, 2);17891790ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1791EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));17921793if (pthread_tryjoin_np(emitter, NULL) < 0) {1794pthread_kill(emitter, SIGUSR1);1795pthread_join(emitter, NULL);1796}17971798close(ctx.efd[0]);1799close(ctx.efd[1]);1800close(ctx.sfd[0]);1801close(ctx.sfd[1]);1802}18031804/*1805* t0 t11806* (p) | | (ew)1807* | e01808* \ / (lt)1809* e11810* | (lt)1811* s01812*/1813TEST(epoll37)1814{1815pthread_t emitter;1816struct pollfd pfd;1817struct epoll_event e;1818struct epoll_mtcontext ctx = { 0 };18191820signal(SIGUSR1, signal_handler);18211822ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);18231824ctx.efd[0] = epoll_create(1);1825ASSERT_GE(ctx.efd[0], 0);18261827ctx.efd[1] = epoll_create(1);1828ASSERT_GE(ctx.efd[1], 0);18291830e.events = EPOLLIN;1831ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);18321833e.events = EPOLLIN;1834ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);18351836ctx.main = pthread_self();1837ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1838ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);18391840pfd.fd = ctx.efd[1];1841pfd.events = POLLIN;1842if (poll(&pfd, 1, -1) > 0) {1843if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)1844__sync_fetch_and_add(&ctx.count, 1);1845}18461847ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1848EXPECT_EQ(ctx.count, 2);18491850if (pthread_tryjoin_np(emitter, NULL) < 0) {1851pthread_kill(emitter, SIGUSR1);1852pthread_join(emitter, NULL);1853}18541855close(ctx.efd[0]);1856close(ctx.efd[1]);1857close(ctx.sfd[0]);1858close(ctx.sfd[1]);1859}18601861/*1862* t0 t11863* (p) | | (ew)1864* | e01865* \ / (lt)1866* e11867* | (et)1868* s01869*/1870TEST(epoll38)1871{1872pthread_t emitter;1873struct pollfd pfd;1874struct epoll_event e;1875struct epoll_mtcontext ctx = { 0 };18761877signal(SIGUSR1, signal_handler);18781879ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);18801881ctx.efd[0] = epoll_create(1);1882ASSERT_GE(ctx.efd[0], 0);18831884ctx.efd[1] = epoll_create(1);1885ASSERT_GE(ctx.efd[1], 0);18861887e.events = EPOLLIN | EPOLLET;1888ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);18891890e.events = EPOLLIN;1891ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);18921893ctx.main = pthread_self();1894ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);1895ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);18961897pfd.fd = ctx.efd[1];1898pfd.events = POLLIN;1899if (poll(&pfd, 1, -1) > 0) {1900if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)1901__sync_fetch_and_or(&ctx.count, 2);1902}19031904ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1905EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));19061907if (pthread_tryjoin_np(emitter, NULL) < 0) {1908pthread_kill(emitter, SIGUSR1);1909pthread_join(emitter, NULL);1910}19111912close(ctx.efd[0]);1913close(ctx.efd[1]);1914close(ctx.sfd[0]);1915close(ctx.sfd[1]);1916}19171918/*1919* t0 t11920* (p) | | (ew)1921* | e01922* \ / (et)1923* e11924* | (lt)1925* s01926*/1927TEST(epoll39)1928{1929pthread_t emitter;1930struct pollfd pfd;1931struct epoll_event e;1932struct epoll_mtcontext ctx = { 0 };19331934signal(SIGUSR1, signal_handler);19351936ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);19371938ctx.efd[0] = epoll_create(1);1939ASSERT_GE(ctx.efd[0], 0);19401941ctx.efd[1] = epoll_create(1);1942ASSERT_GE(ctx.efd[1], 0);19431944e.events = EPOLLIN;1945ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);19461947e.events = EPOLLIN | EPOLLET;1948ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);19491950ctx.main = pthread_self();1951ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);1952ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);19531954pfd.fd = ctx.efd[1];1955pfd.events = POLLIN;1956if (poll(&pfd, 1, -1) > 0) {1957if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)1958__sync_fetch_and_add(&ctx.count, 1);1959}19601961ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);1962EXPECT_EQ(ctx.count, 2);19631964if (pthread_tryjoin_np(emitter, NULL) < 0) {1965pthread_kill(emitter, SIGUSR1);1966pthread_join(emitter, NULL);1967}19681969close(ctx.efd[0]);1970close(ctx.efd[1]);1971close(ctx.sfd[0]);1972close(ctx.sfd[1]);1973}19741975/*1976* t0 t11977* (p) | | (ew)1978* | e01979* \ / (et)1980* e11981* | (et)1982* s01983*/1984TEST(epoll40)1985{1986pthread_t emitter;1987struct pollfd pfd;1988struct epoll_event e;1989struct epoll_mtcontext ctx = { 0 };19901991signal(SIGUSR1, signal_handler);19921993ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);19941995ctx.efd[0] = epoll_create(1);1996ASSERT_GE(ctx.efd[0], 0);19971998ctx.efd[1] = epoll_create(1);1999ASSERT_GE(ctx.efd[1], 0);20002001e.events = EPOLLIN | EPOLLET;2002ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);20032004e.events = EPOLLIN | EPOLLET;2005ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);20062007ctx.main = pthread_self();2008ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1o, &ctx), 0);2009ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);20102011pfd.fd = ctx.efd[1];2012pfd.events = POLLIN;2013if (poll(&pfd, 1, -1) > 0) {2014if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)2015__sync_fetch_and_or(&ctx.count, 2);2016}20172018ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2019EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));20202021if (pthread_tryjoin_np(emitter, NULL) < 0) {2022pthread_kill(emitter, SIGUSR1);2023pthread_join(emitter, NULL);2024}20252026close(ctx.efd[0]);2027close(ctx.efd[1]);2028close(ctx.sfd[0]);2029close(ctx.sfd[1]);2030}20312032/*2033* t0 t12034* (ew) | | (p)2035* | e02036* \ / (lt)2037* e12038* | (lt)2039* s02040*/2041TEST(epoll41)2042{2043pthread_t emitter;2044struct epoll_event e;2045struct epoll_mtcontext ctx = { 0 };20462047signal(SIGUSR1, signal_handler);20482049ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);20502051ctx.efd[0] = epoll_create(1);2052ASSERT_GE(ctx.efd[0], 0);20532054ctx.efd[1] = epoll_create(1);2055ASSERT_GE(ctx.efd[1], 0);20562057e.events = EPOLLIN;2058ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);20592060e.events = EPOLLIN;2061ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);20622063ctx.main = pthread_self();2064ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2065ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);20662067if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)2068__sync_fetch_and_add(&ctx.count, 1);20692070ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2071EXPECT_EQ(ctx.count, 2);20722073if (pthread_tryjoin_np(emitter, NULL) < 0) {2074pthread_kill(emitter, SIGUSR1);2075pthread_join(emitter, NULL);2076}20772078close(ctx.efd[0]);2079close(ctx.efd[1]);2080close(ctx.sfd[0]);2081close(ctx.sfd[1]);2082}20832084/*2085* t0 t12086* (ew) | | (p)2087* | e02088* \ / (lt)2089* e12090* | (et)2091* s02092*/2093TEST(epoll42)2094{2095pthread_t emitter;2096struct epoll_event e;2097struct epoll_mtcontext ctx = { 0 };20982099signal(SIGUSR1, signal_handler);21002101ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);21022103ctx.efd[0] = epoll_create(1);2104ASSERT_GE(ctx.efd[0], 0);21052106ctx.efd[1] = epoll_create(1);2107ASSERT_GE(ctx.efd[1], 0);21082109e.events = EPOLLIN | EPOLLET;2110ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);21112112e.events = EPOLLIN;2113ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);21142115ctx.main = pthread_self();2116ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);2117ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);21182119if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)2120__sync_fetch_and_or(&ctx.count, 2);21212122ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2123EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));21242125if (pthread_tryjoin_np(emitter, NULL) < 0) {2126pthread_kill(emitter, SIGUSR1);2127pthread_join(emitter, NULL);2128}21292130close(ctx.efd[0]);2131close(ctx.efd[1]);2132close(ctx.sfd[0]);2133close(ctx.sfd[1]);2134}21352136/*2137* t0 t12138* (ew) | | (p)2139* | e02140* \ / (et)2141* e12142* | (lt)2143* s02144*/2145TEST(epoll43)2146{2147pthread_t emitter;2148struct epoll_event e;2149struct epoll_mtcontext ctx = { 0 };21502151signal(SIGUSR1, signal_handler);21522153ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);21542155ctx.efd[0] = epoll_create(1);2156ASSERT_GE(ctx.efd[0], 0);21572158ctx.efd[1] = epoll_create(1);2159ASSERT_GE(ctx.efd[1], 0);21602161e.events = EPOLLIN;2162ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);21632164e.events = EPOLLIN | EPOLLET;2165ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);21662167ctx.main = pthread_self();2168ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2169ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);21702171if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)2172__sync_fetch_and_add(&ctx.count, 1);21732174ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2175EXPECT_EQ(ctx.count, 2);21762177if (pthread_tryjoin_np(emitter, NULL) < 0) {2178pthread_kill(emitter, SIGUSR1);2179pthread_join(emitter, NULL);2180}21812182close(ctx.efd[0]);2183close(ctx.efd[1]);2184close(ctx.sfd[0]);2185close(ctx.sfd[1]);2186}21872188/*2189* t0 t12190* (ew) | | (p)2191* | e02192* \ / (et)2193* e12194* | (et)2195* s02196*/2197TEST(epoll44)2198{2199pthread_t emitter;2200struct epoll_event e;2201struct epoll_mtcontext ctx = { 0 };22022203signal(SIGUSR1, signal_handler);22042205ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);22062207ctx.efd[0] = epoll_create(1);2208ASSERT_GE(ctx.efd[0], 0);22092210ctx.efd[1] = epoll_create(1);2211ASSERT_GE(ctx.efd[1], 0);22122213e.events = EPOLLIN | EPOLLET;2214ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);22152216e.events = EPOLLIN | EPOLLET;2217ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);22182219ctx.main = pthread_self();2220ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);2221ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);22222223if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)2224__sync_fetch_and_or(&ctx.count, 2);22252226ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2227EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));22282229if (pthread_tryjoin_np(emitter, NULL) < 0) {2230pthread_kill(emitter, SIGUSR1);2231pthread_join(emitter, NULL);2232}22332234close(ctx.efd[0]);2235close(ctx.efd[1]);2236close(ctx.sfd[0]);2237close(ctx.sfd[1]);2238}22392240/*2241* t0 t12242* (p) | | (p)2243* | e02244* \ / (lt)2245* e12246* | (lt)2247* s02248*/2249TEST(epoll45)2250{2251pthread_t emitter;2252struct pollfd pfd;2253struct epoll_event e;2254struct epoll_mtcontext ctx = { 0 };22552256signal(SIGUSR1, signal_handler);22572258ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);22592260ctx.efd[0] = epoll_create(1);2261ASSERT_GE(ctx.efd[0], 0);22622263ctx.efd[1] = epoll_create(1);2264ASSERT_GE(ctx.efd[1], 0);22652266e.events = EPOLLIN;2267ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);22682269e.events = EPOLLIN;2270ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);22712272ctx.main = pthread_self();2273ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2274ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);22752276pfd.fd = ctx.efd[1];2277pfd.events = POLLIN;2278if (poll(&pfd, 1, -1) > 0) {2279if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)2280__sync_fetch_and_add(&ctx.count, 1);2281}22822283ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2284EXPECT_EQ(ctx.count, 2);22852286if (pthread_tryjoin_np(emitter, NULL) < 0) {2287pthread_kill(emitter, SIGUSR1);2288pthread_join(emitter, NULL);2289}22902291close(ctx.efd[0]);2292close(ctx.efd[1]);2293close(ctx.sfd[0]);2294close(ctx.sfd[1]);2295}22962297/*2298* t0 t12299* (p) | | (p)2300* | e02301* \ / (lt)2302* e12303* | (et)2304* s02305*/2306TEST(epoll46)2307{2308pthread_t emitter;2309struct epoll_event e;2310struct epoll_mtcontext ctx = { 0 };23112312signal(SIGUSR1, signal_handler);23132314ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);23152316ctx.efd[0] = epoll_create(1);2317ASSERT_GE(ctx.efd[0], 0);23182319ctx.efd[1] = epoll_create(1);2320ASSERT_GE(ctx.efd[1], 0);23212322e.events = EPOLLIN | EPOLLET;2323ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);23242325e.events = EPOLLIN;2326ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);23272328ctx.main = pthread_self();2329ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);2330ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);23312332if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)2333__sync_fetch_and_or(&ctx.count, 2);23342335ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2336EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));23372338if (pthread_tryjoin_np(emitter, NULL) < 0) {2339pthread_kill(emitter, SIGUSR1);2340pthread_join(emitter, NULL);2341}23422343close(ctx.efd[0]);2344close(ctx.efd[1]);2345close(ctx.sfd[0]);2346close(ctx.sfd[1]);2347}23482349/*2350* t0 t12351* (p) | | (p)2352* | e02353* \ / (et)2354* e12355* | (lt)2356* s02357*/2358TEST(epoll47)2359{2360pthread_t emitter;2361struct pollfd pfd;2362struct epoll_event e;2363struct epoll_mtcontext ctx = { 0 };23642365signal(SIGUSR1, signal_handler);23662367ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);23682369ctx.efd[0] = epoll_create(1);2370ASSERT_GE(ctx.efd[0], 0);23712372ctx.efd[1] = epoll_create(1);2373ASSERT_GE(ctx.efd[1], 0);23742375e.events = EPOLLIN;2376ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);23772378e.events = EPOLLIN | EPOLLET;2379ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);23802381ctx.main = pthread_self();2382ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2383ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);23842385pfd.fd = ctx.efd[1];2386pfd.events = POLLIN;2387if (poll(&pfd, 1, -1) > 0) {2388if (epoll_wait(ctx.efd[1], &e, 1, 0) > 0)2389__sync_fetch_and_add(&ctx.count, 1);2390}23912392ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2393EXPECT_EQ(ctx.count, 2);23942395if (pthread_tryjoin_np(emitter, NULL) < 0) {2396pthread_kill(emitter, SIGUSR1);2397pthread_join(emitter, NULL);2398}23992400close(ctx.efd[0]);2401close(ctx.efd[1]);2402close(ctx.sfd[0]);2403close(ctx.sfd[1]);2404}24052406/*2407* t0 t12408* (p) | | (p)2409* | e02410* \ / (et)2411* e12412* | (et)2413* s02414*/2415TEST(epoll48)2416{2417pthread_t emitter;2418struct epoll_event e;2419struct epoll_mtcontext ctx = { 0 };24202421signal(SIGUSR1, signal_handler);24222423ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);24242425ctx.efd[0] = epoll_create(1);2426ASSERT_GE(ctx.efd[0], 0);24272428ctx.efd[1] = epoll_create(1);2429ASSERT_GE(ctx.efd[1], 0);24302431e.events = EPOLLIN | EPOLLET;2432ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);24332434e.events = EPOLLIN | EPOLLET;2435ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);24362437ctx.main = pthread_self();2438ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1op, &ctx), 0);2439ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry1, &ctx), 0);24402441if (epoll_wait(ctx.efd[1], &e, 1, -1) > 0)2442__sync_fetch_and_or(&ctx.count, 2);24432444ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2445EXPECT_TRUE((ctx.count == 2) || (ctx.count == 3));24462447if (pthread_tryjoin_np(emitter, NULL) < 0) {2448pthread_kill(emitter, SIGUSR1);2449pthread_join(emitter, NULL);2450}24512452close(ctx.efd[0]);2453close(ctx.efd[1]);2454close(ctx.sfd[0]);2455close(ctx.sfd[1]);2456}24572458/*2459* t02460* | (ew)2461* e02462* (lt) / \ (lt)2463* e1 e22464* (lt) | | (lt)2465* s0 s22466*/2467TEST(epoll49)2468{2469int efd[3];2470int sfd[4];2471struct epoll_event events[2];24722473ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);2474ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);24752476efd[0] = epoll_create(1);2477ASSERT_GE(efd[0], 0);24782479efd[1] = epoll_create(1);2480ASSERT_GE(efd[1], 0);24812482efd[2] = epoll_create(1);2483ASSERT_GE(efd[2], 0);24842485events[0].events = EPOLLIN;2486ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);24872488events[0].events = EPOLLIN;2489ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);24902491events[0].events = EPOLLIN;2492ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);24932494events[0].events = EPOLLIN;2495ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);24962497ASSERT_EQ(write(sfd[1], "w", 1), 1);2498ASSERT_EQ(write(sfd[3], "w", 1), 1);24992500EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);2501EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);25022503close(efd[0]);2504close(efd[1]);2505close(efd[2]);2506close(sfd[0]);2507close(sfd[1]);2508close(sfd[2]);2509close(sfd[3]);2510}25112512/*2513* t02514* | (ew)2515* e02516* (et) / \ (et)2517* e1 e22518* (lt) | | (lt)2519* s0 s22520*/2521TEST(epoll50)2522{2523int efd[3];2524int sfd[4];2525struct epoll_event events[2];25262527ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);2528ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);25292530efd[0] = epoll_create(1);2531ASSERT_GE(efd[0], 0);25322533efd[1] = epoll_create(1);2534ASSERT_GE(efd[1], 0);25352536efd[2] = epoll_create(1);2537ASSERT_GE(efd[2], 0);25382539events[0].events = EPOLLIN;2540ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);25412542events[0].events = EPOLLIN;2543ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);25442545events[0].events = EPOLLIN | EPOLLET;2546ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);25472548events[0].events = EPOLLIN | EPOLLET;2549ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);25502551ASSERT_EQ(write(sfd[1], "w", 1), 1);2552ASSERT_EQ(write(sfd[3], "w", 1), 1);25532554EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);2555EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 0);25562557close(efd[0]);2558close(efd[1]);2559close(efd[2]);2560close(sfd[0]);2561close(sfd[1]);2562close(sfd[2]);2563close(sfd[3]);2564}25652566/*2567* t02568* | (p)2569* e02570* (lt) / \ (lt)2571* e1 e22572* (lt) | | (lt)2573* s0 s22574*/2575TEST(epoll51)2576{2577int efd[3];2578int sfd[4];2579struct pollfd pfd;2580struct epoll_event events[2];25812582ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);2583ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);25842585efd[0] = epoll_create(1);2586ASSERT_GE(efd[0], 0);25872588efd[1] = epoll_create(1);2589ASSERT_GE(efd[1], 0);25902591efd[2] = epoll_create(1);2592ASSERT_GE(efd[2], 0);25932594events[0].events = EPOLLIN;2595ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);25962597events[0].events = EPOLLIN;2598ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);25992600events[0].events = EPOLLIN;2601ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);26022603events[0].events = EPOLLIN;2604ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);26052606ASSERT_EQ(write(sfd[1], "w", 1), 1);2607ASSERT_EQ(write(sfd[3], "w", 1), 1);26082609pfd.fd = efd[0];2610pfd.events = POLLIN;2611EXPECT_EQ(poll(&pfd, 1, 0), 1);2612EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);26132614pfd.fd = efd[0];2615pfd.events = POLLIN;2616EXPECT_EQ(poll(&pfd, 1, 0), 1);2617EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);26182619close(efd[0]);2620close(efd[1]);2621close(efd[2]);2622close(sfd[0]);2623close(sfd[1]);2624close(sfd[2]);2625close(sfd[3]);2626}26272628/*2629* t02630* | (p)2631* e02632* (et) / \ (et)2633* e1 e22634* (lt) | | (lt)2635* s0 s22636*/2637TEST(epoll52)2638{2639int efd[3];2640int sfd[4];2641struct pollfd pfd;2642struct epoll_event events[2];26432644ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[0]), 0);2645ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &sfd[2]), 0);26462647efd[0] = epoll_create(1);2648ASSERT_GE(efd[0], 0);26492650efd[1] = epoll_create(1);2651ASSERT_GE(efd[1], 0);26522653efd[2] = epoll_create(1);2654ASSERT_GE(efd[2], 0);26552656events[0].events = EPOLLIN;2657ASSERT_EQ(epoll_ctl(efd[1], EPOLL_CTL_ADD, sfd[0], events), 0);26582659events[0].events = EPOLLIN;2660ASSERT_EQ(epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[2], events), 0);26612662events[0].events = EPOLLIN | EPOLLET;2663ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[1], events), 0);26642665events[0].events = EPOLLIN | EPOLLET;2666ASSERT_EQ(epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], events), 0);26672668ASSERT_EQ(write(sfd[1], "w", 1), 1);2669ASSERT_EQ(write(sfd[3], "w", 1), 1);26702671pfd.fd = efd[0];2672pfd.events = POLLIN;2673EXPECT_EQ(poll(&pfd, 1, 0), 1);2674EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 2);26752676pfd.fd = efd[0];2677pfd.events = POLLIN;2678EXPECT_EQ(poll(&pfd, 1, 0), 0);2679EXPECT_EQ(epoll_wait(efd[0], events, 2, 0), 0);26802681close(efd[0]);2682close(efd[1]);2683close(efd[2]);2684close(sfd[0]);2685close(sfd[1]);2686close(sfd[2]);2687close(sfd[3]);2688}26892690/*2691* t0 t12692* (ew) \ / (ew)2693* e02694* (lt) / \ (lt)2695* e1 e22696* (lt) | | (lt)2697* s0 s22698*/2699TEST(epoll53)2700{2701pthread_t emitter;2702struct epoll_event e;2703struct epoll_mtcontext ctx = { 0 };27042705signal(SIGUSR1, signal_handler);27062707ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);2708ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);27092710ctx.efd[0] = epoll_create(1);2711ASSERT_GE(ctx.efd[0], 0);27122713ctx.efd[1] = epoll_create(1);2714ASSERT_GE(ctx.efd[1], 0);27152716ctx.efd[2] = epoll_create(1);2717ASSERT_GE(ctx.efd[2], 0);27182719e.events = EPOLLIN;2720ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);27212722e.events = EPOLLIN;2723ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);27242725e.events = EPOLLIN;2726ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);27272728e.events = EPOLLIN;2729ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);27302731ctx.main = pthread_self();2732ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);2733ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);27342735if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)2736__sync_fetch_and_add(&ctx.count, 1);27372738ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2739EXPECT_EQ(ctx.count, 2);27402741if (pthread_tryjoin_np(emitter, NULL) < 0) {2742pthread_kill(emitter, SIGUSR1);2743pthread_join(emitter, NULL);2744}27452746close(ctx.efd[0]);2747close(ctx.efd[1]);2748close(ctx.efd[2]);2749close(ctx.sfd[0]);2750close(ctx.sfd[1]);2751close(ctx.sfd[2]);2752close(ctx.sfd[3]);2753}27542755/*2756* t0 t12757* (ew) \ / (ew)2758* e02759* (et) / \ (et)2760* e1 e22761* (lt) | | (lt)2762* s0 s22763*/2764TEST(epoll54)2765{2766pthread_t emitter;2767struct epoll_event e;2768struct epoll_mtcontext ctx = { 0 };27692770signal(SIGUSR1, signal_handler);27712772ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);2773ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);27742775ctx.efd[0] = epoll_create(1);2776ASSERT_GE(ctx.efd[0], 0);27772778ctx.efd[1] = epoll_create(1);2779ASSERT_GE(ctx.efd[1], 0);27802781ctx.efd[2] = epoll_create(1);2782ASSERT_GE(ctx.efd[2], 0);27832784e.events = EPOLLIN;2785ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);27862787e.events = EPOLLIN;2788ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);27892790e.events = EPOLLIN | EPOLLET;2791ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);27922793e.events = EPOLLIN | EPOLLET;2794ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);27952796ctx.main = pthread_self();2797ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1a, &ctx), 0);2798ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);27992800if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)2801__sync_fetch_and_add(&ctx.count, 1);28022803ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2804EXPECT_EQ(ctx.count, 2);28052806if (pthread_tryjoin_np(emitter, NULL) < 0) {2807pthread_kill(emitter, SIGUSR1);2808pthread_join(emitter, NULL);2809}28102811close(ctx.efd[0]);2812close(ctx.efd[1]);2813close(ctx.efd[2]);2814close(ctx.sfd[0]);2815close(ctx.sfd[1]);2816close(ctx.sfd[2]);2817close(ctx.sfd[3]);2818}28192820/*2821* t0 t12822* (ew) \ / (p)2823* e02824* (lt) / \ (lt)2825* e1 e22826* (lt) | | (lt)2827* s0 s22828*/2829TEST(epoll55)2830{2831pthread_t emitter;2832struct epoll_event e;2833struct epoll_mtcontext ctx = { 0 };28342835signal(SIGUSR1, signal_handler);28362837ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);2838ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);28392840ctx.efd[0] = epoll_create(1);2841ASSERT_GE(ctx.efd[0], 0);28422843ctx.efd[1] = epoll_create(1);2844ASSERT_GE(ctx.efd[1], 0);28452846ctx.efd[2] = epoll_create(1);2847ASSERT_GE(ctx.efd[2], 0);28482849e.events = EPOLLIN;2850ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);28512852e.events = EPOLLIN;2853ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);28542855e.events = EPOLLIN;2856ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);28572858e.events = EPOLLIN;2859ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);28602861ctx.main = pthread_self();2862ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2863ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);28642865if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)2866__sync_fetch_and_add(&ctx.count, 1);28672868ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2869EXPECT_EQ(ctx.count, 2);28702871if (pthread_tryjoin_np(emitter, NULL) < 0) {2872pthread_kill(emitter, SIGUSR1);2873pthread_join(emitter, NULL);2874}28752876close(ctx.efd[0]);2877close(ctx.efd[1]);2878close(ctx.efd[2]);2879close(ctx.sfd[0]);2880close(ctx.sfd[1]);2881close(ctx.sfd[2]);2882close(ctx.sfd[3]);2883}28842885/*2886* t0 t12887* (ew) \ / (p)2888* e02889* (et) / \ (et)2890* e1 e22891* (lt) | | (lt)2892* s0 s22893*/2894TEST(epoll56)2895{2896pthread_t emitter;2897struct epoll_event e;2898struct epoll_mtcontext ctx = { 0 };28992900signal(SIGUSR1, signal_handler);29012902ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);2903ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);29042905ctx.efd[0] = epoll_create(1);2906ASSERT_GE(ctx.efd[0], 0);29072908ctx.efd[1] = epoll_create(1);2909ASSERT_GE(ctx.efd[1], 0);29102911ctx.efd[2] = epoll_create(1);2912ASSERT_GE(ctx.efd[2], 0);29132914e.events = EPOLLIN;2915ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);29162917e.events = EPOLLIN;2918ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);29192920e.events = EPOLLIN | EPOLLET;2921ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);29222923e.events = EPOLLIN | EPOLLET;2924ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);29252926ctx.main = pthread_self();2927ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2928ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);29292930if (epoll_wait(ctx.efd[0], &e, 1, -1) > 0)2931__sync_fetch_and_add(&ctx.count, 1);29322933ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);2934EXPECT_EQ(ctx.count, 2);29352936if (pthread_tryjoin_np(emitter, NULL) < 0) {2937pthread_kill(emitter, SIGUSR1);2938pthread_join(emitter, NULL);2939}29402941close(ctx.efd[0]);2942close(ctx.efd[1]);2943close(ctx.efd[2]);2944close(ctx.sfd[0]);2945close(ctx.sfd[1]);2946close(ctx.sfd[2]);2947close(ctx.sfd[3]);2948}29492950/*2951* t0 t12952* (p) \ / (p)2953* e02954* (lt) / \ (lt)2955* e1 e22956* (lt) | | (lt)2957* s0 s22958*/2959TEST(epoll57)2960{2961pthread_t emitter;2962struct pollfd pfd;2963struct epoll_event e;2964struct epoll_mtcontext ctx = { 0 };29652966signal(SIGUSR1, signal_handler);29672968ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);2969ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);29702971ctx.efd[0] = epoll_create(1);2972ASSERT_GE(ctx.efd[0], 0);29732974ctx.efd[1] = epoll_create(1);2975ASSERT_GE(ctx.efd[1], 0);29762977ctx.efd[2] = epoll_create(1);2978ASSERT_GE(ctx.efd[2], 0);29792980e.events = EPOLLIN;2981ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);29822983e.events = EPOLLIN;2984ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);29852986e.events = EPOLLIN;2987ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);29882989e.events = EPOLLIN;2990ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);29912992ctx.main = pthread_self();2993ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);2994ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);29952996pfd.fd = ctx.efd[0];2997pfd.events = POLLIN;2998if (poll(&pfd, 1, -1) > 0) {2999if (epoll_wait(ctx.efd[0], &e, 1, 0) > 0)3000__sync_fetch_and_add(&ctx.count, 1);3001}30023003ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);3004EXPECT_EQ(ctx.count, 2);30053006if (pthread_tryjoin_np(emitter, NULL) < 0) {3007pthread_kill(emitter, SIGUSR1);3008pthread_join(emitter, NULL);3009}30103011close(ctx.efd[0]);3012close(ctx.efd[1]);3013close(ctx.efd[2]);3014close(ctx.sfd[0]);3015close(ctx.sfd[1]);3016close(ctx.sfd[2]);3017close(ctx.sfd[3]);3018}30193020/*3021* t0 t13022* (p) \ / (p)3023* e03024* (et) / \ (et)3025* e1 e23026* (lt) | | (lt)3027* s0 s23028*/3029TEST(epoll58)3030{3031pthread_t emitter;3032struct pollfd pfd;3033struct epoll_event e;3034struct epoll_mtcontext ctx = { 0 };30353036signal(SIGUSR1, signal_handler);30373038ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[0]), 0);3039ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, &ctx.sfd[2]), 0);30403041ctx.efd[0] = epoll_create(1);3042ASSERT_GE(ctx.efd[0], 0);30433044ctx.efd[1] = epoll_create(1);3045ASSERT_GE(ctx.efd[1], 0);30463047ctx.efd[2] = epoll_create(1);3048ASSERT_GE(ctx.efd[2], 0);30493050e.events = EPOLLIN;3051ASSERT_EQ(epoll_ctl(ctx.efd[1], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);30523053e.events = EPOLLIN;3054ASSERT_EQ(epoll_ctl(ctx.efd[2], EPOLL_CTL_ADD, ctx.sfd[2], &e), 0);30553056e.events = EPOLLIN | EPOLLET;3057ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[1], &e), 0);30583059e.events = EPOLLIN | EPOLLET;3060ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.efd[2], &e), 0);30613062ctx.main = pthread_self();3063ASSERT_EQ(pthread_create(&ctx.waiter, NULL, waiter_entry1ap, &ctx), 0);3064ASSERT_EQ(pthread_create(&emitter, NULL, emitter_entry2, &ctx), 0);30653066pfd.fd = ctx.efd[0];3067pfd.events = POLLIN;3068if (poll(&pfd, 1, -1) > 0) {3069if (epoll_wait(ctx.efd[0], &e, 1, 0) > 0)3070__sync_fetch_and_add(&ctx.count, 1);3071}30723073ASSERT_EQ(pthread_join(ctx.waiter, NULL), 0);3074EXPECT_EQ(ctx.count, 2);30753076if (pthread_tryjoin_np(emitter, NULL) < 0) {3077pthread_kill(emitter, SIGUSR1);3078pthread_join(emitter, NULL);3079}30803081close(ctx.efd[0]);3082close(ctx.efd[1]);3083close(ctx.efd[2]);3084close(ctx.sfd[0]);3085close(ctx.sfd[1]);3086close(ctx.sfd[2]);3087close(ctx.sfd[3]);3088}30893090static void *epoll59_thread(void *ctx_)3091{3092struct epoll_mtcontext *ctx = ctx_;3093struct epoll_event e;3094int i;30953096for (i = 0; i < 100000; i++) {3097while (ctx->count == 0)3098;30993100e.events = EPOLLIN | EPOLLERR | EPOLLET;3101epoll_ctl(ctx->efd[0], EPOLL_CTL_MOD, ctx->sfd[0], &e);3102ctx->count = 0;3103}31043105return NULL;3106}31073108/*3109* t03110* (p) \3111* e03112* (et) /3113* e03114*3115* Based on https://bugzilla.kernel.org/show_bug.cgi?id=2059333116*/3117TEST(epoll59)3118{3119pthread_t emitter;3120struct pollfd pfd;3121struct epoll_event e;3122struct epoll_mtcontext ctx = { 0 };3123int i, ret;31243125signal(SIGUSR1, signal_handler);31263127ctx.efd[0] = epoll_create1(0);3128ASSERT_GE(ctx.efd[0], 0);31293130ctx.sfd[0] = eventfd(1, 0);3131ASSERT_GE(ctx.sfd[0], 0);31323133e.events = EPOLLIN | EPOLLERR | EPOLLET;3134ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);31353136ASSERT_EQ(pthread_create(&emitter, NULL, epoll59_thread, &ctx), 0);31373138for (i = 0; i < 100000; i++) {3139ret = epoll_wait(ctx.efd[0], &e, 1, 1000);3140ASSERT_GT(ret, 0);31413142while (ctx.count != 0)3143;3144ctx.count = 1;3145}3146if (pthread_tryjoin_np(emitter, NULL) < 0) {3147pthread_kill(emitter, SIGUSR1);3148pthread_join(emitter, NULL);3149}3150close(ctx.efd[0]);3151close(ctx.sfd[0]);3152}31533154enum {3155EPOLL60_EVENTS_NR = 10,3156};31573158struct epoll60_ctx {3159volatile int stopped;3160int ready;3161int waiters;3162int epfd;3163int evfd[EPOLL60_EVENTS_NR];3164};31653166static void *epoll60_wait_thread(void *ctx_)3167{3168struct epoll60_ctx *ctx = ctx_;3169struct epoll_event e;3170sigset_t sigmask;3171uint64_t v;3172int ret;31733174/* Block SIGUSR1 */3175sigemptyset(&sigmask);3176sigaddset(&sigmask, SIGUSR1);3177sigprocmask(SIG_SETMASK, &sigmask, NULL);31783179/* Prepare empty mask for epoll_pwait() */3180sigemptyset(&sigmask);31813182while (!ctx->stopped) {3183/* Mark we are ready */3184__atomic_fetch_add(&ctx->ready, 1, __ATOMIC_ACQUIRE);31853186/* Start when all are ready */3187while (__atomic_load_n(&ctx->ready, __ATOMIC_ACQUIRE) &&3188!ctx->stopped);31893190/* Account this waiter */3191__atomic_fetch_add(&ctx->waiters, 1, __ATOMIC_ACQUIRE);31923193ret = epoll_pwait(ctx->epfd, &e, 1, 2000, &sigmask);3194if (ret != 1) {3195/* We expect only signal delivery on stop */3196assert(ret < 0 && errno == EINTR && "Lost wakeup!\n");3197assert(ctx->stopped);3198break;3199}32003201ret = read(e.data.fd, &v, sizeof(v));3202/* Since we are on ET mode, thus each thread gets its own fd. */3203assert(ret == sizeof(v));32043205__atomic_fetch_sub(&ctx->waiters, 1, __ATOMIC_RELEASE);3206}32073208return NULL;3209}32103211static inline unsigned long long msecs(void)3212{3213struct timespec ts;3214unsigned long long msecs;32153216clock_gettime(CLOCK_REALTIME, &ts);3217msecs = ts.tv_sec * 1000ull;3218msecs += ts.tv_nsec / 1000000ull;32193220return msecs;3221}32223223static inline int count_waiters(struct epoll60_ctx *ctx)3224{3225return __atomic_load_n(&ctx->waiters, __ATOMIC_ACQUIRE);3226}32273228TEST(epoll60)3229{3230struct epoll60_ctx ctx = { 0 };3231pthread_t waiters[ARRAY_SIZE(ctx.evfd)];3232struct epoll_event e;3233int i, n, ret;32343235signal(SIGUSR1, signal_handler);32363237ctx.epfd = epoll_create1(0);3238ASSERT_GE(ctx.epfd, 0);32393240/* Create event fds */3241for (i = 0; i < ARRAY_SIZE(ctx.evfd); i++) {3242ctx.evfd[i] = eventfd(0, EFD_NONBLOCK);3243ASSERT_GE(ctx.evfd[i], 0);32443245e.events = EPOLLIN | EPOLLET;3246e.data.fd = ctx.evfd[i];3247ASSERT_EQ(epoll_ctl(ctx.epfd, EPOLL_CTL_ADD, ctx.evfd[i], &e), 0);3248}32493250/* Create waiter threads */3251for (i = 0; i < ARRAY_SIZE(waiters); i++)3252ASSERT_EQ(pthread_create(&waiters[i], NULL,3253epoll60_wait_thread, &ctx), 0);32543255for (i = 0; i < 300; i++) {3256uint64_t v = 1, ms;32573258/* Wait for all to be ready */3259while (__atomic_load_n(&ctx.ready, __ATOMIC_ACQUIRE) !=3260ARRAY_SIZE(ctx.evfd))3261;32623263/* Steady, go */3264__atomic_fetch_sub(&ctx.ready, ARRAY_SIZE(ctx.evfd),3265__ATOMIC_ACQUIRE);32663267/* Wait all have gone to kernel */3268while (count_waiters(&ctx) != ARRAY_SIZE(ctx.evfd))3269;32703271/* 1ms should be enough to schedule away */3272usleep(1000);32733274/* Quickly signal all handles at once */3275for (n = 0; n < ARRAY_SIZE(ctx.evfd); n++) {3276ret = write(ctx.evfd[n], &v, sizeof(v));3277ASSERT_EQ(ret, sizeof(v));3278}32793280/* Busy loop for 1s and wait for all waiters to wake up */3281ms = msecs();3282while (count_waiters(&ctx) && msecs() < ms + 1000)3283;32843285ASSERT_EQ(count_waiters(&ctx), 0);3286}3287ctx.stopped = 1;3288/* Stop waiters */3289for (i = 0; i < ARRAY_SIZE(waiters); i++)3290ret = pthread_kill(waiters[i], SIGUSR1);3291for (i = 0; i < ARRAY_SIZE(waiters); i++)3292pthread_join(waiters[i], NULL);32933294for (i = 0; i < ARRAY_SIZE(waiters); i++)3295close(ctx.evfd[i]);3296close(ctx.epfd);3297}32983299struct epoll61_ctx {3300int epfd;3301int evfd;3302};33033304static void *epoll61_write_eventfd(void *ctx_)3305{3306struct epoll61_ctx *ctx = ctx_;3307int64_t l = 1;33083309usleep(10950);3310write(ctx->evfd, &l, sizeof(l));3311return NULL;3312}33133314static void *epoll61_epoll_with_timeout(void *ctx_)3315{3316struct epoll61_ctx *ctx = ctx_;3317struct epoll_event events[1];3318int n;33193320n = epoll_wait(ctx->epfd, events, 1, 11);3321/*3322* If epoll returned the eventfd, write on the eventfd to wake up the3323* blocking poller.3324*/3325if (n == 1) {3326int64_t l = 1;33273328write(ctx->evfd, &l, sizeof(l));3329}3330return NULL;3331}33323333static void *epoll61_blocking_epoll(void *ctx_)3334{3335struct epoll61_ctx *ctx = ctx_;3336struct epoll_event events[1];33373338epoll_wait(ctx->epfd, events, 1, -1);3339return NULL;3340}33413342TEST(epoll61)3343{3344struct epoll61_ctx ctx;3345struct epoll_event ev;3346int i, r;33473348ctx.epfd = epoll_create1(0);3349ASSERT_GE(ctx.epfd, 0);3350ctx.evfd = eventfd(0, EFD_NONBLOCK);3351ASSERT_GE(ctx.evfd, 0);33523353ev.events = EPOLLIN | EPOLLET | EPOLLERR | EPOLLHUP;3354ev.data.ptr = NULL;3355r = epoll_ctl(ctx.epfd, EPOLL_CTL_ADD, ctx.evfd, &ev);3356ASSERT_EQ(r, 0);33573358/*3359* We are testing a race. Repeat the test case 1000 times to make it3360* more likely to fail in case of a bug.3361*/3362for (i = 0; i < 1000; i++) {3363pthread_t threads[3];3364int n;33653366/*3367* Start 3 threads:3368* Thread 1 sleeps for 10.9ms and writes to the evenfd.3369* Thread 2 calls epoll with a timeout of 11ms.3370* Thread 3 calls epoll with a timeout of -1.3371*3372* The eventfd write by Thread 1 should either wakeup Thread 23373* or Thread 3. If it wakes up Thread 2, Thread 2 writes on the3374* eventfd to wake up Thread 3.3375*3376* If no events are missed, all three threads should eventually3377* be joinable.3378*/3379ASSERT_EQ(pthread_create(&threads[0], NULL,3380epoll61_write_eventfd, &ctx), 0);3381ASSERT_EQ(pthread_create(&threads[1], NULL,3382epoll61_epoll_with_timeout, &ctx), 0);3383ASSERT_EQ(pthread_create(&threads[2], NULL,3384epoll61_blocking_epoll, &ctx), 0);33853386for (n = 0; n < ARRAY_SIZE(threads); ++n)3387ASSERT_EQ(pthread_join(threads[n], NULL), 0);3388}33893390close(ctx.epfd);3391close(ctx.evfd);3392}33933394/* Equivalent to basic test epoll1, but exercising epoll_pwait2. */3395TEST(epoll62)3396{3397int efd;3398int sfd[2];3399struct epoll_event e;34003401ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);34023403efd = epoll_create(1);3404ASSERT_GE(efd, 0);34053406e.events = EPOLLIN;3407ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);34083409ASSERT_EQ(write(sfd[1], "w", 1), 1);34103411EXPECT_EQ(sys_epoll_pwait2(efd, &e, 1, NULL, NULL, 0), 1);3412EXPECT_EQ(sys_epoll_pwait2(efd, &e, 1, NULL, NULL, 0), 1);34133414close(efd);3415close(sfd[0]);3416close(sfd[1]);3417}34183419/* Epoll_pwait2 basic timeout test. */3420TEST(epoll63)3421{3422const int cfg_delay_ms = 10;3423unsigned long long tdiff;3424struct __kernel_timespec ts;3425int efd;3426int sfd[2];3427struct epoll_event e;34283429ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sfd), 0);34303431efd = epoll_create(1);3432ASSERT_GE(efd, 0);34333434e.events = EPOLLIN;3435ASSERT_EQ(epoll_ctl(efd, EPOLL_CTL_ADD, sfd[0], &e), 0);34363437ts.tv_sec = 0;3438ts.tv_nsec = cfg_delay_ms * 1000 * 1000;34393440tdiff = msecs();3441EXPECT_EQ(sys_epoll_pwait2(efd, &e, 1, &ts, NULL, 0), 0);3442tdiff = msecs() - tdiff;34433444EXPECT_GE(tdiff, cfg_delay_ms);34453446close(efd);3447close(sfd[0]);3448close(sfd[1]);3449}34503451/*3452* t0 t13453* (ew) \ / (ew)3454* e03455* | (lt)3456* s03457*/3458TEST(epoll64)3459{3460pthread_t waiter[2];3461struct epoll_event e;3462struct epoll_mtcontext ctx = { 0 };34633464signal(SIGUSR1, signal_handler);34653466ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);34673468ctx.efd[0] = epoll_create(1);3469ASSERT_GE(ctx.efd[0], 0);34703471e.events = EPOLLIN;3472ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);34733474/*3475* main will act as the emitter once both waiter threads are3476* blocked and expects to both be awoken upon the ready event.3477*/3478ctx.main = pthread_self();3479ASSERT_EQ(pthread_create(&waiter[0], NULL, waiter_entry1a, &ctx), 0);3480ASSERT_EQ(pthread_create(&waiter[1], NULL, waiter_entry1a, &ctx), 0);34813482usleep(100000);3483ASSERT_EQ(write(ctx.sfd[1], "w", 1), 1);34843485ASSERT_EQ(pthread_join(waiter[0], NULL), 0);3486ASSERT_EQ(pthread_join(waiter[1], NULL), 0);34873488EXPECT_EQ(ctx.count, 2);34893490close(ctx.efd[0]);3491close(ctx.sfd[0]);3492close(ctx.sfd[1]);3493}34943495TEST_HARNESS_MAIN349634973498