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
sys_epoll_pwait2(int fd,struct epoll_event * events,int maxevents,const struct __kernel_timespec * timeout,const sigset_t * sigset,size_t sigsetsize)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
signal_handler(int signum)39 static void signal_handler(int signum)
40 {
41 }
42
kill_timeout(struct epoll_mtcontext * ctx)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
waiter_entry1a(void * data)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
waiter_entry1ap(void * data)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
waiter_entry1o(void * data)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
waiter_entry1op(void * data)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
waiter_entry2a(void * data)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
waiter_entry2ap(void * data)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
emitter_entry1(void * data)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
emitter_entry2(void * data)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 */
TEST(epoll1)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 */
TEST(epoll2)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 */
TEST(epoll3)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 */
TEST(epoll4)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 */
TEST(epoll5)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 */
TEST(epoll6)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
TEST(epoll7)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 */
TEST(epoll8)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 */
TEST(epoll9)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 */
TEST(epoll10)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 */
TEST(epoll11)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 */
TEST(epoll12)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 */
TEST(epoll13)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 */
TEST(epoll14)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 */
TEST(epoll15)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 */
TEST(epoll16)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 */
TEST(epoll17)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 */
TEST(epoll18)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 */
TEST(epoll19)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 */
TEST(epoll20)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 */
TEST(epoll21)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 */
TEST(epoll22)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 */
TEST(epoll23)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 */
TEST(epoll24)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 */
TEST(epoll25)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 */
TEST(epoll26)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 */
TEST(epoll27)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 */
TEST(epoll28)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 */
TEST(epoll29)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 */
TEST(epoll30)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 */
TEST(epoll31)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 */
TEST(epoll32)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 */
TEST(epoll33)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 */
TEST(epoll34)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 */
TEST(epoll35)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 */
TEST(epoll36)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 */
TEST(epoll37)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 */
TEST(epoll38)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 */
TEST(epoll39)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 */
TEST(epoll40)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 */
TEST(epoll41)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 */
TEST(epoll42)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 */
TEST(epoll43)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 */
TEST(epoll44)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 */
TEST(epoll45)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 */
TEST(epoll46)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 */
TEST(epoll47)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 */
TEST(epoll48)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 */
TEST(epoll49)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 */
TEST(epoll50)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 */
TEST(epoll51)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 */
TEST(epoll52)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 */
TEST(epoll53)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 */
TEST(epoll54)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 */
TEST(epoll55)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 */
TEST(epoll56)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 */
TEST(epoll57)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 */
TEST(epoll58)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
epoll59_thread(void * ctx_)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 */
TEST(epoll59)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
epoll60_wait_thread(void * ctx_)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
msecs(void)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
count_waiters(struct epoll60_ctx * ctx)3224 static inline int count_waiters(struct epoll60_ctx *ctx)
3225 {
3226 return __atomic_load_n(&ctx->waiters, __ATOMIC_ACQUIRE);
3227 }
3228
TEST(epoll60)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
epoll61_write_eventfd(void * ctx_)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
epoll61_epoll_with_timeout(void * ctx_)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
epoll61_blocking_epoll(void * ctx_)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
TEST(epoll61)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. */
TEST(epoll62)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. */
TEST(epoll63)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 */
TEST(epoll64)3459 TEST(epoll64)
3460 {
3461 pthread_t waiter[2];
3462 struct epoll_event e;
3463 struct epoll_mtcontext ctx = { 0 };
3464
3465 signal(SIGUSR1, signal_handler);
3466
3467 ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, ctx.sfd), 0);
3468
3469 ctx.efd[0] = epoll_create(1);
3470 ASSERT_GE(ctx.efd[0], 0);
3471
3472 e.events = EPOLLIN;
3473 ASSERT_EQ(epoll_ctl(ctx.efd[0], EPOLL_CTL_ADD, ctx.sfd[0], &e), 0);
3474
3475 /*
3476 * main will act as the emitter once both waiter threads are
3477 * blocked and expects to both be awoken upon the ready event.
3478 */
3479 ctx.main = pthread_self();
3480 ASSERT_EQ(pthread_create(&waiter[0], NULL, waiter_entry1a, &ctx), 0);
3481 ASSERT_EQ(pthread_create(&waiter[1], NULL, waiter_entry1a, &ctx), 0);
3482
3483 usleep(100000);
3484 ASSERT_EQ(write(ctx.sfd[1], "w", 1), 1);
3485
3486 ASSERT_EQ(pthread_join(waiter[0], NULL), 0);
3487 ASSERT_EQ(pthread_join(waiter[1], NULL), 0);
3488
3489 EXPECT_EQ(ctx.count, 2);
3490
3491 close(ctx.efd[0]);
3492 close(ctx.sfd[0]);
3493 close(ctx.sfd[1]);
3494 }
3495
3496 TEST_HARNESS_MAIN
3497