~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/filesystems/epoll/epoll_wakeup_test.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 16 struct 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 
 30 static 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 
 39 static void signal_handler(int signum)
 40 {
 41 }
 42 
 43 static 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 
 50 static 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 
 61 static 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 
 77 static 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 
 88 static 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 
104 static 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 
115 static 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 
131 static 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 
143 static 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  */
163 TEST(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  */
194 TEST(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  */
225 TEST(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  */
263 TEST(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  */
301 TEST(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  */
340 TEST(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 
380 TEST(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  */
426 TEST(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  */
472 TEST(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  */
515 TEST(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  */
558 TEST(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  */
607 TEST(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  */
656 TEST(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  */
699 TEST(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  */
742 TEST(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  */
791 TEST(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  */
842 TEST(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  */
882 TEST(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  */
922 TEST(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  */
962 TEST(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  */
1002 TEST(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  */
1050 TEST(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  */
1098 TEST(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  */
1146 TEST(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  */
1194 TEST(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  */
1246 TEST(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  */
1298 TEST(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  */
1350 TEST(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  */
1402 TEST(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  */
1453 TEST(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  */
1504 TEST(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  */
1555 TEST(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  */
1606 TEST(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  */
1658 TEST(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  */
1710 TEST(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  */
1762 TEST(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  */
1814 TEST(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  */
1871 TEST(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  */
1928 TEST(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  */
1985 TEST(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  */
2042 TEST(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  */
2094 TEST(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  */
2146 TEST(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  */
2198 TEST(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  */
2250 TEST(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  */
2307 TEST(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  */
2359 TEST(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  */
2416 TEST(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  */
2468 TEST(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  */
2522 TEST(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  */
2576 TEST(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  */
2638 TEST(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  */
2700 TEST(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  */
2765 TEST(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  */
2830 TEST(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  */
2895 TEST(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  */
2960 TEST(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  */
3030 TEST(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 
3091 static 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  */
3118 TEST(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 
3155 enum {
3156         EPOLL60_EVENTS_NR = 10,
3157 };
3158 
3159 struct epoll60_ctx {
3160         volatile int stopped;
3161         int ready;
3162         int waiters;
3163         int epfd;
3164         int evfd[EPOLL60_EVENTS_NR];
3165 };
3166 
3167 static 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 
3212 static 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 
3224 static inline int count_waiters(struct epoll60_ctx *ctx)
3225 {
3226         return __atomic_load_n(&ctx->waiters, __ATOMIC_ACQUIRE);
3227 }
3228 
3229 TEST(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 
3300 struct epoll61_ctx {
3301         int epfd;
3302         int evfd;
3303 };
3304 
3305 static 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 
3315 static 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 
3334 static 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 
3343 TEST(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. */
3396 TEST(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. */
3421 TEST(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  */
3459 TEST(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 
3496 TEST_HARNESS_MAIN
3497 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php