• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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