[PATCH 00/21] FIFO: Support multiple readers
Takashi Yano
takashi.yano@nifty.ne.jp
Mon May 18 05:25:19 GMT 2020
On Thu, 7 May 2020 16:21:03 -0400
Ken Brown via Cygwin-patches <cygwin-patches@cygwin.com> wrote:
> 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).
> See
>
> https://sourceware.org/pipermail/cygwin/2019-December/243317.html
>
> 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
> dup/fork/exec.
>
> This explained some of the bugs reported by Kristian Ivarsson. See,
> for example, the thread starting here:
>
> https://sourceware.org/pipermail/cygwin/2020-March/000206.html
>
> 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
> and testing.]
>
> 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(-)
Great work! Now, mc (midnight commander) starts without errro
message under tcsh!
However, mc hangs by several operations.
To reproduce this:
1. Start mc with 'env SHELL=tcsh mc -a'
2. Select a file using up/down cursor keys.
3. Press F3 (View) key.
This causes hang-up.
--
Takashi Yano <takashi.yano@nifty.ne.jp>
More information about the Cygwin-patches
mailing list