1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3 * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4 */
5
6 #include <unistd.h>
7 #include <errno.h>
8 #include <poll.h>
9 #include <sys/eventfd.h>
10
11 #include "mpp_eventfd.h"
12
mpp_eventfd_get(RK_U32 init)13 RK_S32 mpp_eventfd_get(RK_U32 init)
14 {
15 RK_S32 fd = eventfd(init, 0);
16
17 if (fd < 0)
18 fd = errno;
19
20 return fd;
21 }
22
mpp_eventfd_put(RK_S32 fd)23 RK_S32 mpp_eventfd_put(RK_S32 fd)
24 {
25 if (fd >= 0)
26 close(fd);
27
28 return 0;
29 }
30
mpp_eventfd_read(RK_S32 fd,RK_U64 * val,RK_S64 timeout)31 RK_S32 mpp_eventfd_read(RK_S32 fd, RK_U64 *val, RK_S64 timeout)
32 {
33 struct pollfd nfds;
34 RK_U64 tmp = 0;
35 RK_S32 ret = 0;
36
37 if (NULL == val)
38 val = &tmp;
39
40 nfds.fd = fd;
41 nfds.events = POLLIN;
42
43 ret = poll(&nfds, 1, timeout);
44 if (ret == 1 && (nfds.revents & POLLIN) &&
45 sizeof(RK_U64) == read(fd, val, sizeof(RK_U64))) {
46 ret = 0;
47 } else
48 ret = errno;
49
50 return ret;
51 }
52
mpp_eventfd_write(RK_S32 fd,RK_U64 val)53 RK_S32 mpp_eventfd_write(RK_S32 fd, RK_U64 val)
54 {
55 RK_S32 ret = 0;
56
57 if (sizeof(RK_U64) != write(fd, &val, sizeof(val)))
58 ret = errno;
59
60 return ret;
61 }
62