public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: FIFO: improve taking ownership in fifo_reader_thread
@ 2020-07-16 20:00 Ken Brown
0 siblings, 0 replies; only message in thread
From: Ken Brown @ 2020-07-16 20:00 UTC (permalink / raw)
To: cygwin-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=6b8a8294966316f6e044e78f76579a18a3e9c173
commit 6b8a8294966316f6e044e78f76579a18a3e9c173
Author: Ken Brown <kbrown@cornell.edu>
Date: Sat Jul 11 14:52:55 2020 -0400
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.
Diff:
---
winsup/cygwin/fhandler_fifo.cc | 44 ++++++++++++++++++++++--------------------
1 file changed, 23 insertions(+), 21 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,12 +462,30 @@ fhandler_fifo::fifo_reader_thread_func ()
take_ownership = true;
else if (cur_owner != me)
idle = true;
- if (take_ownership)
+ else
+ /* I'm the owner. */
+ goto owner_listen;
+ if (idle)
+ {
+ owner_unlock ();
+ HANDLE w[2] = { owner_needed_evt, cancel_evt };
+ switch (WaitForMultipleObjects (2, w, false, INFINITE))
+ {
+ case WAIT_OBJECT_0:
+ continue;
+ case WAIT_OBJECT_0 + 1:
+ goto canceled;
+ default:
+ api_fatal ("WFMO failed, %E");
+ }
+ }
+ else if (take_ownership)
{
if (!shared_fc_handler_updated ())
{
owner_unlock ();
- yield ();
+ if (IsEventSignalled (cancel_evt))
+ goto canceled;
continue;
}
else
@@ -478,26 +496,11 @@ fhandler_fifo::fifo_reader_thread_func ()
api_fatal ("Can't update my handlers, %E");
owner_found ();
owner_unlock ();
- continue;
+ /* Fall through to owner_listen. */
}
}
- else if (idle)
- {
- owner_unlock ();
- HANDLE w[2] = { owner_needed_evt, cancel_evt };
- switch (WaitForMultipleObjects (2, w, false, INFINITE))
- {
- case WAIT_OBJECT_0:
- continue;
- case WAIT_OBJECT_0 + 1:
- goto canceled;
- default:
- api_fatal ("WFMO failed, %E");
- }
- }
- else
- {
- /* I'm the owner */
+
+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)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-07-16 20:00 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-16 20:00 [newlib-cygwin] Cygwin: FIFO: improve taking ownership in fifo_reader_thread Ken Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).