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