Cygwin: pipe: handle signals explicitely in raw_write

The simple cygwait call in fhandler_pipe_fifo::raw_write doesn't
take the SA_RESTART setting into account. Move handling the
signal into raw_write.

Fixes: 4b25687ea3 ("Cygwin: fhandler_pipe: add raw_read and raw_write")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2024-08-18 21:40:51 +02:00
parent b2e05e03df
commit 7f3c225325
1 changed files with 12 additions and 3 deletions

View File

@ -498,9 +498,16 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
(PVOID) ptr, len1, NULL, NULL);
if (status == STATUS_PENDING)
{
while (WAIT_TIMEOUT ==
(waitret = cygwait (evt, (DWORD) 0, cw_cancel | cw_sig)))
do
{
/* To allow constant reader_closed() checking even if the
signal has been set up with SA_RESTART, we're handling
the signal here --> cw_sig_eintr. */
waitret = cygwait (evt, (DWORD) 0, cw_cancel | cw_sig_eintr);
/* Break out if no SA_RESTART. */
if (waitret == WAIT_SIGNALED
&& !_my_tls.call_signal_handler ())
break;
if (reader_closed ())
{
CancelIo (get_handle ());
@ -509,8 +516,10 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len)
goto out;
}
else
cygwait (select_sem, 10);
cygwait (select_sem, 10, cw_cancel);
}
/* Loop in case of blocking write or SA_RESTART */
while (waitret == WAIT_TIMEOUT || waitret == WAIT_SIGNALED);
/* If io.Status is STATUS_CANCELLED after CancelIo, IO has
actually been cancelled and io.Information contains the
number of bytes processed so far.