[Haskell-cafe] concurrency vs. I/O in GHC
Donn Cave
donn at avvanta.com
Mon Oct 18 00:21:13 EDT 2010
[I wrote initially, ...]
> As I have migrated more of my application into Haskell, I find that
> I/O in one thread effectively blocks other threads.
Resolved - the SSL_read external I/O function needs to be "safe".
My apologies for botching the mailing list threading, but I deleted
the mail wherein someone helpfully asked whether I'd made my foreign
calls "safe" or "unsafe", and I can't see that message on the archives.
My initial take was, yes, of course I make external calls "safe",
because they sure are going to trigger callbacks into the Haskell
runtime and the documentation is quite clear about that.
However, I'd made SSL_read "unsafe", since no callbacks there.
Reversed that, and now my threads execute concurrently - SSL_read
doesn't block Haskell execution in all the other threads.
Either way, I can also report that it doesn't seem to matter whether
SSL_read was called from a callback, or not. If unsafe, it blocks
all the other threads either way, and if safe, it doesn't block them
either way.
So, thanks a lot, whoever you were! Henceforth I will play it safe
and eschew unsafeness. I vaguely recall a discussion here a ways back,
wherein the terms "safe" and "unsafe" were lamented and various confusing
propositions were bandied about. I should dig that up if I can, and
see if this practical example sheds some light on any of it.
Donn Cave, donn at avvanta.com
More information about the Haskell-Cafe
mailing list