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