[Haskell-cafe] Re: all threads are blocked by recvFrom

Adam Langley agl at imperialviolet.org
Fri Mar 14 10:57:20 EDT 2008


On Fri, Mar 14, 2008 at 7:43 AM, Vitaliy Akimov
<vitaliy.akimov at gmail.com> wrote:
> Rebuilding of the network package with changed safety helped but I
>  don't think this is the solution. BTW accept is declared as safe. What
>  is the reason of declaring recvFrom as unsafe?  I think this breaks
>  highly required feature. Apparently it's impossible to make concurrent
>  server for non connection based protocols.

I assume that you're binding the libc function directly here:

In that case, you need to have the RTS manage sleeping your thread for
you. You should make the socket non-blocking and handle the EAGAIN and
EWOULDBLOCK cases by calling threadWaitRead[1] to block the current
Haskell thread only, until the fd is readable. Note that
threadWaitRead is GHC only.

If you download the source to network-bytestring[2], you can see a
very similar pattern in the code for send and recv in there.

Alternatively, you can use the functions in Network.Socket, which
should work fine.

[1] http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html#v%3AthreadWaitRead
[2] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/network-bytestring-0.1.1.2


-- 
Adam Langley agl at imperialviolet.org http://www.imperialviolet.org


More information about the Haskell-Cafe mailing list