On Mon Nov 13, 2023 at 3:32 PM CET, Adrien Zinger wrote: > Add a function in core `gpiod_line_request_wait_edge_events_or` with an > additional argument `fd` to trigger ppoll manually from another thread. > > It allows users to gracefully cancel and join a worker thread waiting > for an edge event. > > Signed-off-by: Adrien Zinger <zinger.ad@xxxxxxxxx> > --- > include/gpiod.h | 17 ++++++++++++++ > lib/internal.c | 38 ++++++++++++++++++++++++------ > lib/internal.h | 1 + > lib/line-request.c | 9 +++++++ > tests/tests-edge-event.c | 51 ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 109 insertions(+), 7 deletions(-) > > diff --git a/include/gpiod.h b/include/gpiod.h > index d86c6ac..cbc83f9 100644 > --- a/include/gpiod.h > +++ b/include/gpiod.h > @@ -1176,6 +1176,23 @@ int gpiod_line_request_get_fd(struct gpiod_line_request *request); > int gpiod_line_request_wait_edge_events(struct gpiod_line_request *request, > int64_t timeout_ns); > > +/** > + * @brief Wait for edge events on any of the requested lines or a > + * POLLHUP/POLLERR event on the given file descriptor. > + * @param request GPIO line request. > + * @param fd file descriptor from any I/O, channel, fifo, or pipe. > + * @param timeout_ns Wait time limit in nanoseconds. If set to 0, the function > + * returns immediately. If set to a negative number, the > + * function blocks indefinitely until an event becomes > + * available. > + * @return 0 if wait timed out, -1 if an error occurred, 1 if an event is > + * pending, 2 if the file descriptor raised an event. > + * > + * Lines must have edge detection set for edge events to be emitted. > + * By default edge detection is disabled. > + */ > +int gpiod_line_request_wait_edge_events_or(struct gpiod_line_request *request, > + int fd, int64_t timeout_ns); This sounds like an oddly specific API... I wonder, why does gpiod_line_request_get_fd [1] + doing the polling in your code not work for you? Since you already got a file descriptor for the notification that seems like little extra work. Or did you consider that but find it too verbose? [1] https://libgpiod.readthedocs.io/en/latest/group__line__request.html#ga5c0dbdcd8608b76e77b78bca9a6b03d7 - Erik