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.y...@nifty.ne.jp>