From 6b8a8294966316f6e044e78f76579a18a3e9c173 Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Sat, 11 Jul 2020 14:52:55 -0400 Subject: [PATCH] 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. --- winsup/cygwin/fhandler_fifo.cc | 48 ++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index afe21a468..1fb319fcf 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -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)