kselftest: introduce new epoll test case
[linux-2.6-microblaze.git] / tools / testing / selftests / filesystems / epoll / epoll_wakeup_test.c
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