[PATCH 00/21] FIFO: Support multiple readers
Thu May 7 20:21:03 GMT 2020
This project began as a an attempt to allow a FIFO to be opened
multiple times for reading. The initial motivation was that Midnight
Commander running under tcsh does this (unsuccessfully on Cygwin).
It quickly became apparent, however, that the current code doesn't
even properly handle the case where the FIFO is *explicitly* opened
only once for reading, but additional readers are created via
This explained some of the bugs reported by Kristian Ivarsson. See,
for example, the thread starting here:
as well as later similar threads.
[The discussion continued in private email, with many bug reports and
test programs by Kristian. I'm very grateful to him for his reports
The first 10 patches in this series make some improvements and bug
fixes that came up along the way and don't specifically relate to
multiple readers. The next 10 patches, with the exception of "allow
fc_handler list to grow dynamically", add the support for multiple
readers. The last one updates the commentary at the beginning of
fhandler_fifo.cc that tries to explain how it all works.
The key ideas in these patches are:
1. Use shared memory, so that all readers have the necessary
information about the writers that are open.
2. Designate one reader as the "owner". This reader runs a thread
that listens for connections and keeps track of the writers.
3. Use a second shared memory block to be used for transfer of
ownership. Ownership must be transferred when the owner closes or
execs. And a reader that wants to read or run select must take
ownership in order to be able to poll the writers for input.
The patches in this series have been applied to the topic/fifo branch
in case it's easier to review/test them there.
Ken Brown (21):
Cygwin: FIFO: minor change - use NtClose
Cygwin: FIFO: simplify the fifo_client_handler structure
Cygwin: FIFO: change the fifo_client_connect_state enum
Cygwin: FIFO: simplify the listen_client_thread code
Cygwin: FIFO: remove the arm method
Cygwin: FIFO: honor the flags argument in dup
Cygwin: FIFO: dup/fork/exec: make sure child starts unlocked
Cygwin: FIFO: fix hit_eof
Cygwin: FIFO: make opening a writer more robust
Cygwin: FIFO: use a cygthread instead of a homemade thread
Cygwin: FIFO: add shared memory
Cygwin: FIFO: keep track of the number of readers
Cygwin: FIFO: introduce a new type, fifo_reader_id_t
Cygwin: FIFO: designate one reader as owner
Cygwin: FIFO: allow fc_handler list to grow dynamically
Cygwin: FIFO: add a shared fifo_client_handler list
Cygwin: FIFO: take ownership on exec
Cygwin: FIFO: find a new owner when closing
Cygwin: FIFO: allow any reader to take ownership
Cygwin: FIFO: support opening multiple readers
Cygwin: FIFO: update commentary
winsup/cygwin/fhandler.h | 208 ++++-
winsup/cygwin/fhandler_fifo.cc | 1564 ++++++++++++++++++++++----------
winsup/cygwin/select.cc | 48 +-
3 files changed, 1311 insertions(+), 509 deletions(-)
More information about the Cygwin-patches