caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* thread i/o
@ 1999-01-12 20:12 Michael Hicks
  1999-01-13 13:20 ` Xavier Leroy
  0 siblings, 1 reply; 2+ messages in thread
From: Michael Hicks @ 1999-01-12 20:12 UTC (permalink / raw)
  To: caml-list

One of the adverisements of OCaml 2.01 was that user-level (not POSIX)
thread I/O is made faster.  The trick used in the implementation is to make
sockets non-blocking, and then only perform a select() when the I/O would
have blocked (by signalling EINTR or EWOULDBLOCK).  However, looking at the
implementation, it looks like in many cases the select() is performed
anyway.  Here is an excerpt from threadUnix.ml:

let rec read fd buff ofs len =
  Thread.wait_read fd;
  try Unix.read fd buff ofs len
  with Unix_error((EAGAIN | EWOULDBLOCK), _, _) -> read fd buff ofs len

The implementation of Thread.wait_read and Thread.wait_write will perform
either a select() or go through the scheduler which will perform the
select().  It seems to me that the implementation should be:

let rec read fd buff ofs len =
  try Unix.read fd buff ofs len
  with Unix_error((EAGAIN | EWOULDBLOCK), _, _) -> 
    begin
      Thread.wait_read fd;
      read fd buff ofs len
    end

This way, if I/O is already available, there is no need to do the extra
select().  Am I missing something?
Mike

-- 
Michael Hicks
Ph.D. Candidate, the University of Pennsylvania
http://www.cis.upenn.edu/~mwh            mailto://mwh@dsl.cis.upenn.edu
"I worked with an individual who plugged his power strip back into itself
and for the life of him could not understand why his computer would not
turn on."




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1999-01-13 17:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-01-12 20:12 thread i/o Michael Hicks
1999-01-13 13:20 ` Xavier Leroy

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 NNTP newsgroup(s).