On Sun, 10 Mar 2024 05:49:43 +0000
wh wrote:
> Here's how to reproduce this behavior.
> 
> In test3.pl:
> 
> #!/usr/bin/perl
> my $wfds = '';
> vec($wfds, fileno(STDOUT), 1) = 1;
> sleep 1;
> print STDERR "selecting\n";
> select undef, $wfds, undef, undef;
> print STDERR "ready\n";
> print "abc\n";
> 
> Then run:
> 
> # curl is as shipped with Windows, /cygdrive/c/Windows/system32/curl
> ./test3.pl | (curl --version && cat)
> 
> Expected result:
> 
> curl 8.4.0 (Windows) libcurl/8.4.0 Schannel WinIDN
> ...
> selecting
> ready
> abc
> 
> Actual result:
> 
> curl 8.4.0 (Windows) libcurl/8.4.0 Schannel WinIDN
> ...
> selecting
> (hang)
> 
> Using strace on perl, it ends with
> 
>    95  332358 [main] perl 733 clock_nanosleep: clock_nanosleep (1.000000000)
> 1004437 1336795 [main] perl 733 clock_nanosleep: 0 = clock_nanosleep(1, 0, 
> 1.000000000, 0.d)
>   247 1337042 [main] perl 733 time: 1710048216 = time(0x7FFFFCA00)
>  1010 1338052 [main] perl 733 fhandler_console::write: 0xA00051B10, 10
>   822 1338874 [main] perl 733 fhandler_console::write: 10 = 
> fhandler_console::write(...)
>   203 1339077 [main] perl 733 write: 10 = write(2, 0xA00051B10, 10)
>   254 1339331 [main] perl 733 pselect: pselect (8, 0x0, 0xA000330E0, 0x0, 
> 0x0, 0x0)
>   207 1339538 [main] perl 733 pselect: to NULL, us -1
>   490 1340028 [main] perl 733 dtable::select_write:  fd 1
>   191 1340219 [main] perl 733 select: sel.always_ready 0
> --- Process 6888 (pid: 733) thread 784 created
>   859 1341078 [pipesel] perl 733 cygthread::stub: thread 'pipesel', id 0x310, 
> stack_ptr 0x2BBCCB0
>   192 1341270 [main] perl 733 select_stuff::wait: m 3, us 
> 18446744073709551615, wmfo_timeout -1
>   196 1341466 [pipesel] perl 733 SetThreadName: SetThreadDescription() 
> failed. 00000000 10000000
> 
> Pipesel never comes back.
> 
> Other info:
> 
> - Replacing cat with tee (tee with no args is the same as cat) makes it work. 
> tee reads in smaller chunks, while cat reads at the pipe buffer size. 
> Comments in select.cc suggest this is important, but I don't understand it 
> all.
> - Removing the curl makes it work
> - Using curl </dev/null to make curl not touch stdin makes it work
> - Using a Cygwin program instead of a non-Cygwin program e.g. id instead of 
> curl makes it work
> - Removing the select confirms that nothing weird is breaking the pipe, and 
> the "abc' shows up properly
> 
> There was a report in MSYS2 https://github.com/msys2/msys2-runtime/issues/202 
> also about pipes to external programs, but there are some differences. In 
> this scenario the non-Cygwin curl doesn't actually read anything from the 
> pipe, and it should have exited before the select call. I tried a build of 
> MSYS2 with their fix, and it still hangs in this way.

Thanks for the report. I looked into this problem, and found the cause.
Let me consider how to fix that.

-- 
Takashi Yano <takashi.y...@nifty.ne.jp>

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to