This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH 10/14] Cygwin: FIFO: use a retry loop when opening a writer
- From: Ken Brown <kbrown at cornell dot edu>
- To: "cygwin-patches at cygwin dot com" <cygwin-patches at cygwin dot com>
- Date: Sun, 14 Apr 2019 19:16:02 +0000
- Subject: [PATCH 10/14] Cygwin: FIFO: use a retry loop when opening a writer
- References: <20190414191543.3218-1-kbrown@cornell.edu>
There may be short periods when there's no pipe instance available.
Keep trying.
---
winsup/cygwin/fhandler_fifo.cc | 52 ++++++++++++++++++++--------------
1 file changed, 31 insertions(+), 21 deletions(-)
diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc
index 479021e8e..d4d2b3883 100644
--- a/winsup/cygwin/fhandler_fifo.cc
+++ b/winsup/cygwin/fhandler_fifo.cc
@@ -30,6 +30,12 @@ STATUS_PIPE_EMPTY simply means there's no data to be read. */
|| _s == STATUS_PIPE_BROKEN \
|| _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_base (), read_ready (NULL), write_ready (NULL),
listen_client_thr (NULL), lct_termination_evt (NULL), nhandlers (0),
@@ -543,28 +549,32 @@ fhandler_fifo::open (int flags, mode_t)
listen_client thread is running. Then signal write_ready. */
if (writer)
{
- if (!wait (read_ready))
- {
- res = error_errno_set;
- goto out;
- }
- NTSTATUS status = open_pipe ();
- if (!NT_SUCCESS (status))
- {
- debug_printf ("create of writer failed");
- __seterrno_from_nt_status (status);
- res = error_errno_set;
- goto out;
- }
- else if (!arm (write_ready))
+ while (1)
{
- res = error_set_errno;
- goto out;
- }
- else
- {
- set_pipe_non_blocking (get_handle (), true);
- res = success;
+ if (!wait (read_ready))
+ {
+ res = error_errno_set;
+ goto out;
+ }
+ NTSTATUS status = open_pipe ();
+ 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");
+ __seterrno_from_nt_status (status);
+ res = error_errno_set;
+ goto out;
+ }
}
}
out:
--
2.17.0