Hi Corinna, On Sat, 6 Nov 2021 12:42:46 +0100 Corinna Vinschen wrote: > On Nov 6 15:10, Takashi Yano wrote: > > Unfortunately, these solutions do not resolve the issue > > which is another issue with C# program: > > https://cygwin.com/pipermail/cygwin/2021-March/247987.html > > This still needs FILE_SYNCHRONOUS_IO_NONALERT flag. > > If we want to add FILE_SYNCHRONOUS_IO_NONALERT, this would have to be > solved by running NtReadFile/NtWriteFile synchronously in a thread, > started on every invocation of raw_read/raw_write. raw_read/raw_write > would then call cygwait on the thread object. To break on signal or > thread cancallation events, it would have to call CancelSynchronousIo. > That's certainly doable. I tried to implement your idea, however, I noticed that NtQueryObject(ObjectNameInformation) call in get_query_hdl_per_process() is blocked while reading the pipe if FIPE_SYNCHRONOUS_IO_NONALERT is set and pipe is in blocking mode. So I would like to propose alternative implementation with FILE_SYNCHRONOUS_IO_NONALERT being set. Please have a look at attached patch. With this patch, pipe itself in read side is always set to nonblocking mode and simulate the blocking behaviour in raw_read(). This can eliminate creating thread for reading as well as calling CancelSynchronousIo(). Note that setting FILE_SYNCHRONOUS_IO_NONALERT only for read pipe seems to be enough for C# programs. What do you think of this implementation? -- Takashi Yano