1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_eventfd_test"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include "mpp_log.h"
9*437bfbebSnyanmisaka #include "mpp_time.h"
10*437bfbebSnyanmisaka #include "mpp_common.h"
11*437bfbebSnyanmisaka #include "mpp_thread.h"
12*437bfbebSnyanmisaka #include "mpp_eventfd.h"
13*437bfbebSnyanmisaka
14*437bfbebSnyanmisaka #define WR_VAL 1
15*437bfbebSnyanmisaka #define RD_VAL 10
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka static RK_S32 data_fd = -1;
18*437bfbebSnyanmisaka static RK_S32 sync_fd = -1;
19*437bfbebSnyanmisaka static RK_U64 wr_val_base = WR_VAL;
20*437bfbebSnyanmisaka static RK_U64 rd_val_base = RD_VAL;
21*437bfbebSnyanmisaka static RK_U64 wr_val = WR_VAL;
22*437bfbebSnyanmisaka static RK_U64 rd_val = RD_VAL;
23*437bfbebSnyanmisaka static RK_S32 wr_ret = -1;
24*437bfbebSnyanmisaka static RK_S32 rd_ret = -1;
25*437bfbebSnyanmisaka static RK_S64 wr_timeout = -1;
26*437bfbebSnyanmisaka static RK_S64 rd_timeout = -1;
27*437bfbebSnyanmisaka
reset_test()28*437bfbebSnyanmisaka void reset_test()
29*437bfbebSnyanmisaka {
30*437bfbebSnyanmisaka wr_val = wr_val_base;
31*437bfbebSnyanmisaka rd_val = rd_val_base;
32*437bfbebSnyanmisaka wr_ret = -1;
33*437bfbebSnyanmisaka rd_ret = -1;
34*437bfbebSnyanmisaka rd_val_base++;
35*437bfbebSnyanmisaka
36*437bfbebSnyanmisaka mpp_eventfd_write(data_fd, 0);
37*437bfbebSnyanmisaka mpp_eventfd_read(data_fd, NULL, 0);
38*437bfbebSnyanmisaka
39*437bfbebSnyanmisaka mpp_log("eventfd test on writing %lld -> %lld\n", wr_val, rd_val);
40*437bfbebSnyanmisaka }
41*437bfbebSnyanmisaka
thread_read(void * arg)42*437bfbebSnyanmisaka void *thread_read(void *arg)
43*437bfbebSnyanmisaka {
44*437bfbebSnyanmisaka (void) arg;
45*437bfbebSnyanmisaka mpp_eventfd_write(sync_fd, 1);
46*437bfbebSnyanmisaka
47*437bfbebSnyanmisaka rd_ret = mpp_eventfd_read(data_fd, &rd_val, rd_timeout);
48*437bfbebSnyanmisaka mpp_log("eventfd read %d timeout %d ret %lld val %lld\n", data_fd, rd_timeout, rd_ret, rd_val);
49*437bfbebSnyanmisaka
50*437bfbebSnyanmisaka return NULL;
51*437bfbebSnyanmisaka }
52*437bfbebSnyanmisaka
main()53*437bfbebSnyanmisaka int main()
54*437bfbebSnyanmisaka {
55*437bfbebSnyanmisaka pthread_t td;
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka mpp_log("eventfd test start\n");
58*437bfbebSnyanmisaka
59*437bfbebSnyanmisaka data_fd = mpp_eventfd_get(0);
60*437bfbebSnyanmisaka sync_fd = mpp_eventfd_get(0);
61*437bfbebSnyanmisaka
62*437bfbebSnyanmisaka mpp_log("eventfd get data_fd %d sync_fd %d\n", data_fd, sync_fd);
63*437bfbebSnyanmisaka
64*437bfbebSnyanmisaka reset_test();
65*437bfbebSnyanmisaka rd_timeout = -1;
66*437bfbebSnyanmisaka wr_timeout = 0;
67*437bfbebSnyanmisaka
68*437bfbebSnyanmisaka pthread_create(&td, NULL, thread_read, NULL);
69*437bfbebSnyanmisaka mpp_eventfd_read(sync_fd, NULL, -1);
70*437bfbebSnyanmisaka mpp_log("eventfd write %d val %lld\n", data_fd, wr_val);
71*437bfbebSnyanmisaka wr_ret = mpp_eventfd_write(data_fd, wr_val);
72*437bfbebSnyanmisaka pthread_join(td, NULL);
73*437bfbebSnyanmisaka mpp_log("eventfd block mode test wr: %lld ret %d rd: %lld ret %d - %s\n",
74*437bfbebSnyanmisaka wr_val, wr_ret, rd_val, rd_ret,
75*437bfbebSnyanmisaka (wr_val == rd_val) ? "success" : "failed");
76*437bfbebSnyanmisaka
77*437bfbebSnyanmisaka reset_test();
78*437bfbebSnyanmisaka rd_timeout = 0;
79*437bfbebSnyanmisaka wr_timeout = 100;
80*437bfbebSnyanmisaka
81*437bfbebSnyanmisaka pthread_create(&td, NULL, thread_read, NULL);
82*437bfbebSnyanmisaka mpp_eventfd_read(sync_fd, NULL, -1);
83*437bfbebSnyanmisaka msleep(wr_timeout);
84*437bfbebSnyanmisaka mpp_log("eventfd write %d val %lld\n", data_fd, wr_val);
85*437bfbebSnyanmisaka wr_ret = mpp_eventfd_write(data_fd, wr_val);
86*437bfbebSnyanmisaka pthread_join(td, NULL);
87*437bfbebSnyanmisaka mpp_log("eventfd non-block mode test wr: %lld ret %d rd: %lld ret %d - %s\n",
88*437bfbebSnyanmisaka wr_val, wr_ret, rd_val, rd_ret,
89*437bfbebSnyanmisaka (wr_val != rd_val) ? "success" : "failed");
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka reset_test();
92*437bfbebSnyanmisaka rd_timeout = 100;
93*437bfbebSnyanmisaka wr_timeout = 1;
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka pthread_create(&td, NULL, thread_read, NULL);
96*437bfbebSnyanmisaka mpp_eventfd_read(sync_fd, NULL, -1);
97*437bfbebSnyanmisaka msleep(wr_timeout);
98*437bfbebSnyanmisaka mpp_log("eventfd write %d val %lld\n", data_fd, wr_val);
99*437bfbebSnyanmisaka wr_ret = mpp_eventfd_write(data_fd, wr_val);
100*437bfbebSnyanmisaka pthread_join(td, NULL);
101*437bfbebSnyanmisaka mpp_log("eventfd timeout mode test wr: %lld ret %d rd: %lld ret %d - %s\n",
102*437bfbebSnyanmisaka wr_val, wr_ret, rd_val, rd_ret,
103*437bfbebSnyanmisaka (wr_val == rd_val) ? "success" : "failed");
104*437bfbebSnyanmisaka
105*437bfbebSnyanmisaka reset_test();
106*437bfbebSnyanmisaka rd_timeout = 1;
107*437bfbebSnyanmisaka wr_timeout = 100;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka pthread_create(&td, NULL, thread_read, NULL);
110*437bfbebSnyanmisaka mpp_eventfd_read(sync_fd, NULL, -1);
111*437bfbebSnyanmisaka msleep(wr_timeout);
112*437bfbebSnyanmisaka mpp_log("eventfd write %d val %lld\n", data_fd, wr_val);
113*437bfbebSnyanmisaka wr_ret = mpp_eventfd_write(data_fd, wr_val);
114*437bfbebSnyanmisaka pthread_join(td, NULL);
115*437bfbebSnyanmisaka mpp_log("eventfd timeout mode test wr: %lld ret %d rd: %lld ret %d - %s\n",
116*437bfbebSnyanmisaka wr_val, wr_ret, rd_val, rd_ret,
117*437bfbebSnyanmisaka (wr_val != rd_val) ? "success" : "failed");
118*437bfbebSnyanmisaka
119*437bfbebSnyanmisaka mpp_eventfd_put(data_fd);
120*437bfbebSnyanmisaka mpp_eventfd_put(sync_fd);
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka mpp_log("eventfd test done\n");
123*437bfbebSnyanmisaka
124*437bfbebSnyanmisaka return 0;
125*437bfbebSnyanmisaka }
126*437bfbebSnyanmisaka
127