1 /*
2  * Copyright (c) 2020 Tobias Svehagen
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_ZEPHYR_ZVFS_EVENTFD_H_
8 #define ZEPHYR_INCLUDE_ZEPHYR_ZVFS_EVENTFD_H_
9 
10 #include <stdint.h>
11 
12 #include <zephyr/kernel.h>
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #define ZVFS_EFD_SEMAPHORE 2
19 #define ZVFS_EFD_NONBLOCK 0x4000
20 
21 typedef uint64_t zvfs_eventfd_t;
22 
23 /**
24  * @brief Create a file descriptor for ZVFS event notification
25  *
26  * The returned file descriptor can be used with POSIX read/write calls or
27  * with the @ref zvfs_eventfd_read or @ref zvfs_eventfd_write functions.
28  *
29  * It also supports polling and by including an eventfd in a call to poll,
30  * it is possible to signal and wake the polling thread by simply writing to
31  * the eventfd.
32  *
33  * When using read() and write() on a ZVFS eventfd, the size must always be at
34  * least 8 bytes or the operation will fail with EINVAL.
35  *
36  * @return New ZVFS eventfd file descriptor on success, -1 on error
37  */
38 int zvfs_eventfd(unsigned int initval, int flags);
39 
40 /**
41  * @brief Read from a ZVFS eventfd
42  *
43  * If call is successful, the value parameter will have the value 1
44  *
45  * @param fd File descriptor
46  * @param value Pointer for storing the read value
47  *
48  * @return 0 on success, -1 on error
49  */
50 int zvfs_eventfd_read(int fd, zvfs_eventfd_t *value);
51 
52 /**
53  * @brief Write to a ZVFS eventfd
54  *
55  * @param fd File descriptor
56  * @param value Value to write
57  *
58  * @return 0 on success, -1 on error
59  */
60 int zvfs_eventfd_write(int fd, zvfs_eventfd_t value);
61 
62 #ifdef __cplusplus
63 }
64 #endif
65 
66 #endif /* ZEPHYR_INCLUDE_ZEPHYR_ZVFS_EVENTFD_H_ */
67