Cygwin: FIFO: improve taking ownership in fifo_reader_thread

When a reader takes ownership in fifo_reader_thread, it now goes
directly to the part of the main loop that listens for a connection.
Previously it went back to the beginning of the loop.

Also, if the reader has to delay taking ownership because the previous
owner has not finished updating the shared fifo_client handlers, it
now checks to see if cancel_evt has been set.  Previously it might
have had to spin its wheels unnecessarily only to eventually find that
its thread had been canceled.
This commit is contained in:
Ken Brown 2020-07-11 14:52:55 -04:00
parent 1c0cf5f4f9
commit 6b8a829496
1 changed files with 25 additions and 23 deletions

View File

@ -462,26 +462,10 @@ fhandler_fifo::fifo_reader_thread_func ()
take_ownership = true;
else if (cur_owner != me)
idle = true;
if (take_ownership)
{
if (!shared_fc_handler_updated ())
{
owner_unlock ();
yield ();
continue;
}
else
{
set_owner (me);
set_pending_owner (null_fr_id);
if (update_my_handlers () < 0)
api_fatal ("Can't update my handlers, %E");
owner_found ();
owner_unlock ();
continue;
}
}
else if (idle)
else
/* I'm the owner. */
goto owner_listen;
if (idle)
{
owner_unlock ();
HANDLE w[2] = { owner_needed_evt, cancel_evt };
@ -495,9 +479,28 @@ fhandler_fifo::fifo_reader_thread_func ()
api_fatal ("WFMO failed, %E");
}
}
else
else if (take_ownership)
{
/* I'm the owner */
if (!shared_fc_handler_updated ())
{
owner_unlock ();
if (IsEventSignalled (cancel_evt))
goto canceled;
continue;
}
else
{
set_owner (me);
set_pending_owner (null_fr_id);
if (update_my_handlers () < 0)
api_fatal ("Can't update my handlers, %E");
owner_found ();
owner_unlock ();
/* Fall through to owner_listen. */
}
}
owner_listen:
fifo_client_lock ();
cleanup_handlers ();
if (add_client_handler () < 0)
@ -590,7 +593,6 @@ fhandler_fifo::fifo_reader_thread_func ()
fifo_client_unlock ();
if (cancel)
goto canceled;
}
}
canceled:
if (conn_evt)