Cygwin: FIFO: use a retry loop when opening a writer

There may be short periods when there's no pipe instance available.
Keep trying.
This commit is contained in:
Ken Brown 2019-04-14 19:16:02 +00:00 committed by Corinna Vinschen
parent 6b20be0944
commit c5bc7a8065
1 changed files with 31 additions and 21 deletions

View File

@ -30,6 +30,12 @@ STATUS_PIPE_EMPTY simply means there's no data to be read. */
|| _s == STATUS_PIPE_BROKEN \ || _s == STATUS_PIPE_BROKEN \
|| _s == STATUS_PIPE_EMPTY; }) || _s == STATUS_PIPE_EMPTY; })
#define STATUS_PIPE_NO_INSTANCE_AVAILABLE(status) \
({ NTSTATUS _s = (status); \
_s == STATUS_INSTANCE_NOT_AVAILABLE \
|| _s == STATUS_PIPE_NOT_AVAILABLE \
|| _s == STATUS_PIPE_BUSY; })
fhandler_fifo::fhandler_fifo (): fhandler_fifo::fhandler_fifo ():
fhandler_base (), read_ready (NULL), write_ready (NULL), fhandler_base (), read_ready (NULL), write_ready (NULL),
listen_client_thr (NULL), lct_termination_evt (NULL), nhandlers (0), listen_client_thr (NULL), lct_termination_evt (NULL), nhandlers (0),
@ -542,6 +548,8 @@ fhandler_fifo::open (int flags, mode_t)
pipe. This should always succeed quickly if the reader's pipe. This should always succeed quickly if the reader's
listen_client thread is running. Then signal write_ready. */ listen_client thread is running. Then signal write_ready. */
if (writer) if (writer)
{
while (1)
{ {
if (!wait (read_ready)) if (!wait (read_ready))
{ {
@ -549,22 +557,24 @@ fhandler_fifo::open (int flags, mode_t)
goto out; goto out;
} }
NTSTATUS status = open_pipe (); NTSTATUS status = open_pipe ();
if (!NT_SUCCESS (status)) if (NT_SUCCESS (status))
{
set_pipe_non_blocking (get_handle (), true);
if (!arm (write_ready))
res = error_set_errno;
else
res = success;
goto out;
}
else if (STATUS_PIPE_NO_INSTANCE_AVAILABLE (status))
Sleep (1);
else
{ {
debug_printf ("create of writer failed"); debug_printf ("create of writer failed");
__seterrno_from_nt_status (status); __seterrno_from_nt_status (status);
res = error_errno_set; res = error_errno_set;
goto out; goto out;
} }
else if (!arm (write_ready))
{
res = error_set_errno;
goto out;
}
else
{
set_pipe_non_blocking (get_handle (), true);
res = success;
} }
} }
out: out: