WCHAR pipe_name_buf[CYGWIN_FIFO_PIPE_NAME_LEN + 1];
fifo_client_handler client[MAX_CLIENTS];
int nclients, nconnected;
+ af_unix_spinlock_t _fifo_client_lock;
bool __reg2 wait (HANDLE);
NTSTATUS npfs_handle (HANDLE &);
HANDLE create_pipe_instance (bool);
fhandler_fifo ();
PUNICODE_STRING get_pipe_name ();
DWORD listen_client_thread ();
+ void fifo_client_lock () { _fifo_client_lock.lock (); }
+ void fifo_client_unlock () { _fifo_client_lock.unlock (); }
int open (int, mode_t);
off_t lseek (off_t offset, int whence);
int close ();
int i;
DWORD wait_ret;
+ fifo_client_lock ();
found = false;
for (i = 0; i < nclients; i++)
switch (client[i].state)
{
case fc_invalid:
if (disconnect_and_reconnect (i) < 0)
- goto errout;
+ {
+ fifo_client_unlock ();
+ goto errout;
+ }
/* Fall through. */
case fc_connected:
w[i] = client[i].dummy_evt;
break;
}
w[nclients] = lct_termination_evt;
+ int res = 0;
if (!found)
- {
- if (add_client () < 0)
- goto errout;
- else
- continue;
- }
+ res = add_client ();
+ fifo_client_unlock ();
+ if (res < 0)
+ goto errout;
+ else if (!found)
+ continue;
+
if (!arm (read_ready))
{
__seterrno ();
return 0;
else
{
+ fifo_client_lock ();
client[i].state = fc_connected;
nconnected++;
set_pipe_non_blocking (client[i].fh->get_handle (), true);
+ fifo_client_unlock ();
yield ();
}
}
}
/* Poll the connected clients for input. */
+ fifo_client_lock ();
for (int i = 0; i < nclients; i++)
if (client[i].state == fc_connected)
{
client[i].fh->fhandler_base::raw_read (in_ptr, len);
ssize_t nread = (ssize_t) len;
if (nread > 0)
- return;
+ {
+ fifo_client_unlock ();
+ return;
+ }
else if (nread < 0 && GetLastError () != ERROR_NO_DATA)
- goto errout;
+ {
+ fifo_client_unlock ();
+ goto errout;
+ }
else if (nread == 0) /* Client has disconnected. */
{
client[i].state = fc_invalid;
nconnected--;
}
}
+ fifo_client_unlock ();
if (is_nonblocking ())
{
set_errno (EAGAIN);