On 24/06/2009 07:33, Brandon S. Allbery KF8NH wrote:
On Jun 24, 2009, at 02:27 , Sittampalam, Ganesh wrote:
Brandon S. Allbery KF8NH wrote:
Sure - but it hurts more when in some environments you get away with
it and others you don't.
You'll still have that though, it'll just be a different set of
environments. The next failure mode after this one is writing more
than _PIPE_BUF down ih; you'll deadlock in the write when in blocking
mode, in non-blocking mode it depends on how the runtime handles
partial writes.
I'd hope for consistency across the GHC runtimes though.
You can hope, but I get the impression blocking/non-blocking maps to
threaded/non-threaded respectively in which case all bets are off.
(Unless the ghc runtime guarantees some specific behavior here.)
GHC uses non-blocking mode for all FDs that are "internal", i.e. not
shared with external processes. This is the case for both the threaded
and non-threaded RTSs. The difference between blocking/non-blocking
mode and the size of PIPE_BUF should be mostly invisible to the Haskell
programmer (although see http://hackage.haskell.org/trac/ghc/ticket/3316
for a bug we have in this area, which I fixed yesterday).
There's one exception: if GHC is forced to use blocking mode on a
particular FD, and you're using the non-threaded RTS, then a large write
using hPutBuf may block all Haskell threads. There doesn't seem to be
much we can do about this, except to use the threaded RTS or lobby the
Linux kernel guys for a better API.
Cheers,
Simon
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users