This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Fifo blocking and performance issues
- From: bob <bob at icanprogram dot com>
- To: cygwin at cygwin dot com
- Date: Tue, 02 Oct 2012 15:15:37 -0400
- Subject: Fifo blocking and performance issues
We are continuing our long drawn out effort to port the SIMPL toolkit
(http://www.icanprogram.com/simpl) to the Cygwin platform. For a long time
we were unable to proceed due to issues with the fifo implementation under
Cygwin. These issues have largely been addressed in more recent Cygwin
releases. However, some curious and frustrating issues remain.
The most difficult remaining issue concerns the difference in blocking behavior
of Cygwin RDWR fifos versus their Linux counterparts. Under Linux you can
open a fifo as RDWR and have it safely and conveniently block on the subsequent
read if there is no information on the fifo (or no other partner on the other
end). Under Cygwin RDWR fifos block on the open call until the partner
shows up. We hacked around this "problem" by opening RDWR+O_NONBLOCK
on Cygwin and then surrounding our reads with a selec()t on the file
descriptor. While this hack works the performance under Cygwin is orders of
magnitude slower than the equivalent Linux performance.
Any suggestions on how we can achieve a higher performance blocking read on a
Cygwin RDWR fifo?
The second issue is related. The other end of these RDWR fifos is typically
open WRONLY. Most of the time the open does not block but occasionally we
have found a condition where this open does block. Early experimentation
points to a condition whereby the fifo was previously opened and written to by
another process and where that process continues to have an open file
descriptor.
Once again are there any good suggestions on how to avoid blocking on a
multiplexed WRONLY fifo open?
The final issue concerns the select() hack described above. When running our
benchmark test which repeatly composes and sends a message, we notice that
occasionally (once every 50 times or so) the select releases but the
subsequent read fails with errno 11 (resource temporarily unavailable). If
this error is "ignored" and the read retried things seem to work.
Any ideas?
Thanks in advance for your help.
bob
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple