1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved.
4 * Author: Xie Ziyao <xieziyao@huawei.com>
5 */
6
7 /*\
8 * [Description]
9 *
10 * Check that a timeout equal to zero causes epoll_wait() to return immediately.
11 */
12
13 #include <sys/epoll.h>
14
15 #include "tst_test.h"
16 #include "tst_timer_test.h"
17
18 #define USEC_PRECISION 1000 /* Error margin allowed in usec */
19
20 static int epfd, fds[2];
21 static struct epoll_event epevs[1] = {
22 {.events = EPOLLIN}
23 };
24
run(void)25 static void run(void)
26 {
27 tst_timer_start(CLOCK_MONOTONIC);
28 TEST(epoll_wait(epfd, epevs, 1, 0));
29 tst_timer_stop();
30
31 if (TST_RET != 0)
32 tst_res(TFAIL | TTERRNO, "epoll_wait() returned %li", TST_RET);
33
34 if (tst_timer_elapsed_us() <= USEC_PRECISION)
35 tst_res(TPASS, "epoll_wait() returns immediately with a timeout equal to zero");
36 else
37 tst_res(TFAIL, "epoll_wait() waited for %llius with a timeout equal to zero",
38 tst_timer_elapsed_us());
39 }
40
setup(void)41 static void setup(void)
42 {
43 SAFE_PIPE(fds);
44
45 epfd = epoll_create(1);
46 if (epfd == -1)
47 tst_brk(TBROK | TERRNO, "epoll_create()");
48
49 epevs[0].data.fd = fds[0];
50
51 if (epoll_ctl(epfd, EPOLL_CTL_ADD, fds[0], &epevs[0]))
52 tst_brk(TBROK | TERRNO, "epoll_ctl(..., EPOLL_CTL_ADD, ...)");
53 }
54
cleanup(void)55 static void cleanup(void)
56 {
57 if (epfd > 0)
58 SAFE_CLOSE(epfd);
59
60 if (fds[0] > 0)
61 SAFE_CLOSE(fds[0]);
62
63 if (fds[1] > 0)
64 SAFE_CLOSE(fds[1]);
65 }
66
67 static struct tst_test test = {
68 .test_all = run,
69 .setup = setup,
70 .cleanup = cleanup,
71 };
72