xref: /rockchip-linux_mpp/osal/mpp_eventfd.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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