Cygwin: FIFO: improve EOF detection
Add a hit_eof method that tries to detect whether any clients are connected. Before concluding that there are none, it gives the listen_client thread time to update the client data.
This commit is contained in:
parent
c75e077f99
commit
c6e221c036
|
@ -1277,6 +1277,7 @@ class fhandler_fifo: public fhandler_base
|
||||||
bool listen_client ();
|
bool listen_client ();
|
||||||
public:
|
public:
|
||||||
fhandler_fifo ();
|
fhandler_fifo ();
|
||||||
|
bool hit_eof ();
|
||||||
PUNICODE_STRING get_pipe_name ();
|
PUNICODE_STRING get_pipe_name ();
|
||||||
DWORD listen_client_thread ();
|
DWORD listen_client_thread ();
|
||||||
void fifo_client_lock () { _fifo_client_lock.lock (); }
|
void fifo_client_lock () { _fifo_client_lock.lock (); }
|
||||||
|
|
|
@ -654,6 +654,25 @@ fhandler_fifo::raw_write (const void *ptr, size_t len)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A FIFO open for reading is at EOF if no process has it open for
|
||||||
|
writing. We test this by checking nconnected. But we must take
|
||||||
|
account of the possible delay from the time of connection to the
|
||||||
|
time the connection is recorded by the listen_client thread. */
|
||||||
|
bool
|
||||||
|
fhandler_fifo::hit_eof ()
|
||||||
|
{
|
||||||
|
fifo_client_lock ();
|
||||||
|
bool eof = (nconnected == 0);
|
||||||
|
fifo_client_unlock ();
|
||||||
|
if (eof)
|
||||||
|
{
|
||||||
|
/* Give the listen_client thread time to catch up, then recheck. */
|
||||||
|
Sleep (1);
|
||||||
|
eof = (nconnected == 0);
|
||||||
|
}
|
||||||
|
return eof;
|
||||||
|
}
|
||||||
|
|
||||||
void __reg3
|
void __reg3
|
||||||
fhandler_fifo::raw_read (void *in_ptr, size_t& len)
|
fhandler_fifo::raw_read (void *in_ptr, size_t& len)
|
||||||
{
|
{
|
||||||
|
@ -665,7 +684,7 @@ fhandler_fifo::raw_read (void *in_ptr, size_t& len)
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (nconnected == 0) /* EOF */
|
if (hit_eof ())
|
||||||
{
|
{
|
||||||
len = 0;
|
len = 0;
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue