This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]