xref: /aosp_15_r20/external/ltp/testcases/kernel/syscalls/eventfd2/eventfd2_03.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) Ulrich Drepper <[email protected]>
4  * Copyright (c) International Business Machines  Corp., 2009
5  * Copyright (C) 2023 SUSE LLC Andrea Cervesato <[email protected]>
6  */
7 
8 /*\
9  * [Description]
10  *
11  * This test verifies that eventfd2 semaphore-like support is properly working.
12  */
13 
14 #include <fcntl.h>
15 #include <stdlib.h>
16 #include <sys/eventfd.h>
17 #include "tst_test.h"
18 #include "eventfd2.h"
19 
xsem_wait(int fd)20 static void xsem_wait(int fd)
21 {
22 	u_int64_t cntr;
23 
24 	SAFE_READ(0, fd, &cntr, sizeof(cntr));
25 }
26 
xsem_post(int fd,int count)27 static void xsem_post(int fd, int count)
28 {
29 	u_int64_t cntr = count;
30 
31 	SAFE_WRITE(0, fd, &cntr, sizeof(cntr));
32 }
33 
sem_player(int fd1,int fd2)34 static void sem_player(int fd1, int fd2)
35 {
36 	pid_t pid = getpid();
37 
38 	tst_res(TINFO, "[%u] posting 1 on fd=%d", pid, fd1);
39 	xsem_post(fd1, 1);
40 
41 	tst_res(TINFO, "[%u] waiting on fd=%d", pid, fd2);
42 	xsem_wait(fd2);
43 
44 	tst_res(TINFO, "[%u] posting 5 on fd=%d", pid, fd1);
45 	xsem_post(fd1, 5);
46 
47 	tst_res(TINFO, "[%u] waiting 5 times on fd=%d", pid, fd2);
48 	xsem_wait(fd2);
49 	xsem_wait(fd2);
50 	xsem_wait(fd2);
51 	xsem_wait(fd2);
52 	xsem_wait(fd2);
53 
54 	tst_res(TPASS, "[%u] received all events", pid);
55 }
56 
run(void)57 static void run(void)
58 {
59 	pid_t cpid_poster, cpid_waiter;
60 	int fd1, fd2;
61 
62 	fd1 = eventfd2(0, EFD_SEMAPHORE);
63 	fd2 = eventfd2(0, EFD_SEMAPHORE);
64 
65 	cpid_poster = SAFE_FORK();
66 	if (!cpid_poster) {
67 		sem_player(fd1, fd2);
68 		exit(0);
69 	}
70 
71 	cpid_waiter = SAFE_FORK();
72 	if (!cpid_waiter) {
73 		sem_player(fd2, fd1);
74 		exit(0);
75 	}
76 }
77 
78 static struct tst_test test = {
79 	.test_all = run,
80 	.forks_child = 1,
81 };
82