Heinz Junkes created an issue:
https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5623
## Summary
Location: cpukit/libfs/src/pipe/{pipe.c,fifo.c}
Root cause: pipe() clears LIBIO_FLAGS_NO_DELAY on the read fd after open
(pipe.c:89).
pipe_ioctl (fifo.c:435) only implements FIONREAD, with no FIONBIO case and no
fcntl(F_SETFL) passthrough that updates iop flags
Effect: pipe_read's LIBIO_NODELAY(iop) check (fifo.c:309) is dead code for any
fd obtained via pipe()
[reads on an empty pipe always block, regardless of subsequent non-blocking
calls]
## Steps to reproduce
breaks any library relying on the standard non-blocking-pipe
self-pipe/notification pattern (libevent, EPICS extension PVXS, on RTEMS 7 (
origin/main )
I'm currently working on libevent (EPICS PVXS):
evutil_make_internal_pipe_ in bundled libevent used pipe() + O_NONBLOCK for
cross-thread event loop notification. On RTEMS libbsd, O_NONBLOCK on pipe file
descriptors is unreliable — reads block instead of returning EAGAIN. This
caused evthread_notify_drain_default to block holding the libevent internal
lock, deadlocking event_base_loop in all evbase instances, preventing
acceptor_loop.call() from ever completing.
Fix: Add && !defined(__rtems__) to the #if defined(EVENT__HAVE_PIPE) guard in
bundle/libevent/evutil.c, forcing libevent to use socketpair(AF_UNIX,
SOCK_STREAM) instead on RTEMS — which works correctly.
<!-- Pre-set options
- milestone
-->
--
View it on GitLab: https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5623
You're receiving this email because of your account on gitlab.rtems.org.
_______________________________________________
bugs mailing list
[email protected]
http://lists.rtems.org/mailman/listinfo/bugs