[PATCH 00/21] FIFO: Support multiple readers

Ken Brown kbrown@cornell.edu
Tue May 19 12:51:03 GMT 2020


On 5/19/2020 2:15 AM, Takashi Yano via Cygwin-patches wrote:
> On Tue, 19 May 2020 10:26:09 +0900
> Takashi Yano via Cygwin-patches <cygwin-patches@cygwin.com> wrote:
>> Hi Ken,
>>
>> On Mon, 18 May 2020 13:42:19 -0400
>> Ken Brown via Cygwin-patches <cygwin-patches@cygwin.com> wrote:
>>> Hi Takashi,
>>>
>>> On 5/18/2020 12:03 PM, Ken Brown via Cygwin-patches wrote:
>>>> On 5/18/2020 1:36 AM, Takashi Yano via Cygwin-patches wrote:
>>>>> On Mon, 18 May 2020 14:25:19 +0900
>>>>> Takashi Yano via Cygwin-patches <cygwin-patches@cygwin.com> wrote:
>>>>>> However, mc hangs by several operations.
>>>>>>
>>>>>> To reproduce this:
>>>>>> 1. Start mc with 'env SHELL=tcsh mc -a'
>>>>>
>>>>> I mean 'env SHELL=/bin/tcsh mc -a'
>>>>>
>>>>>> 2. Select a file using up/down cursor keys.
>>>>>> 3. Press F3 (View) key.
>>>>
>>>> Thanks for the report.  I can reproduce the problem and will look into it.
>>>
>>> I'm not convinced that this is a FIFO bug.  I tried two things.
>>>
>>> 1. I attached gdb to mc while it was hanging and got the following backtrace
>>> (abbreviated):
>>>
>>> #1  0x00007ff901638037 in WaitForMultipleObjectsEx ()
>>> #2  0x00007ff901637f1e in WaitForMultipleObjects ()
>>> #3  0x0000000180048df5 in cygwait () at ...winsup/cygwin/cygwait.cc:75
>>> #4  0x000000018019b1c0 in wait4 () at ...winsup/cygwin/wait.cc:80
>>> #5  0x000000018019afea in waitpid () at ...winsup/cygwin/wait.cc:28
>>> #6  0x000000018017d2d8 in pclose () at ...winsup/cygwin/syscalls.cc:4627
>>> #7  0x000000018015943b in _sigfe () at sigfe.s:35
>>> #8  0x000000010040d002 in get_popen_information () at filemanager/ext.c:561
>>> [...]
>>>
>>> So pclose is blocking after calling waitpid.  As far as I can tell from looking
>>> at backtraces of all threads, there are no FIFOs open.
>>>
>>> 2. I ran mc under strace (after exporting SHELL=/bin/tcsh), and I didn't see
>>> anything suspicious involving FIFOs.  But I saw many EBADF errors from fstat and
>>> close that don't appear to be related to FIFOs.
>>>
>>> So my best guess at this point is that the FIFO changes just exposed some
>>> unrelated bug(s).
>>>
>>> Prior to the FIFO changes, mc would get an error when it tried to open tcsh_fifo
>>> the second time, and it would then set
>>>
>>>     mc_global.tty.use_subshell = FALSE;
>>>
>>> see the mc source file subshell/common.c:1087.
>>
>> I looked into this problem and found pclose() stucks if FIFO
>> is opened.
>>
>> Attached is a simple test case. It works under cygwin 3.1.4,
>> but stucks at pclose() under cygwin git head.
>>
>> Isn't this a FIFO related issue?
> 
> In the test case, fhandler_fifo::close() called from /bin/true
> seems to get into infinite loop at:
> 
> do
> ...
> while (inc_nreaders () > 0 && !found);

Thank you!  I see the problem.  After the popen call, the original 
fhandler_fifo's fifo_reader_thread was no longer running, so it was unable to 
take ownership.

It might take a little while for me to figure out how to fix this.

Thanks for your persistence and, especially, for the test case.

Ken


More information about the Cygwin-patches mailing list