Skip to content

Commit

Permalink
Cygwin: pipe: handle signals explicitely in raw_write
Browse files Browse the repository at this point in the history
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: 4b25687 ("Cygwin: fhandler_pipe: add raw_read and raw_write")
Signed-off-by: Corinna Vinschen <[email protected]>
  • Loading branch information
github-cygwin committed Aug 18, 2024
1 parent b2e05e0 commit 7f3c225
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions winsup/cygwin/fhandler/pipe.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 ());
Expand All @@ -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.
Expand Down

0 comments on commit 7f3c225

Please sign in to comment.