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:
parent
6b20be0944
commit
c5bc7a8065
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue