summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/fhandler_fifo.cc51
1 files changed, 16 insertions, 35 deletions
diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc
index f9796f300..479021e8e 100644
--- a/winsup/cygwin/fhandler_fifo.cc
+++ b/winsup/cygwin/fhandler_fifo.cc
@@ -344,6 +344,8 @@ fhandler_fifo::listen_client ()
DWORD
fhandler_fifo::listen_client_thread ()
{
+ DWORD ret = -1;
+
while (1)
{
bool found;
@@ -360,7 +362,7 @@ fhandler_fifo::listen_client_thread ()
if (disconnect_and_reconnect (i) < 0)
{
fifo_client_unlock ();
- goto errout;
+ goto out;
}
else
/* Recheck fc_handler[i].state. */
@@ -383,23 +385,27 @@ fhandler_fifo::listen_client_thread ()
res = add_client_handler ();
fifo_client_unlock ();
if (res < 0)
- goto errout;
+ goto out;
else if (!found)
continue;
+ /* Allow a writer to open. */
if (!arm (read_ready))
{
__seterrno ();
- goto errout;
+ goto out;
}
/* Wait for a client to connect. */
wait_ret = WaitForMultipleObjects (nhandlers + 1, w, false, INFINITE);
i = wait_ret - WAIT_OBJECT_0;
if (i < 0 || i > nhandlers)
- goto errout;
- else if (i == nhandlers) /* Reader is closing. */
- return 0;
+ goto out;
+ else if (i == nhandlers) /* Thread termination requested. */
+ {
+ ret = 0;
+ goto out;
+ }
else
{
fifo_client_lock ();
@@ -410,9 +416,9 @@ fhandler_fifo::listen_client_thread ()
yield ();
}
}
-errout:
+out:
ResetEvent (read_ready);
- return -1;
+ return ret;
}
int
@@ -457,7 +463,7 @@ fhandler_fifo::open (int flags, mode_t)
char npbuf[MAX_PATH];
__small_sprintf (npbuf, "r-event.%08x.%016X", get_dev (), get_ino ());
- if (!(read_ready = CreateEvent (sa_buf, duplexer, false, npbuf)))
+ if (!(read_ready = CreateEvent (sa_buf, true, false, npbuf)))
{
debug_printf ("CreateEvent for %s failed, %E", npbuf);
res = error_set_errno;
@@ -523,32 +529,7 @@ fhandler_fifo::open (int flags, mode_t)
res = error_errno_set;
goto out;
}
- /* Wait for the listen_client thread to signal read_ready. This
- should be quick. */
- HANDLE w[2] = { listen_client_thr, read_ready };
- switch (WaitForMultipleObjects (2, w, FALSE, INFINITE))
- {
- case WAIT_OBJECT_0:
- debug_printf ("listen_client_thread exited unexpectedly");
- DWORD err;
- GetExitCodeThread (listen_client_thr, &err);
- __seterrno_from_win_error (err);
- res = error_errno_set;
- goto out;
- break;
- case WAIT_OBJECT_0 + 1:
- if (!arm (read_ready))
- {
- res = error_set_errno;
- goto out;
- }
- break;
- default:
- res = error_set_errno;
- goto out;
- break;
- }
- if (!duplexer && !wait (write_ready))
+ else if (!duplexer && !wait (write_ready))
{
res = error_errno_set;
goto out;