Am Freitag, 6. Juli 2007 04:15 schrieb Thomas Conway:
> On 7/6/07, Lukas Mai <[EMAIL PROTECTED]> wrote:
> > I don't see how this solves the problem. AFAICS acceptLoop never returns
> > and sok is never closed. On the other hand, my program doesn't need a
> > liveOpCount because the subthreads take care of themselves. It's just the
> > accept loop I need to break somehow.
>
> Well, it works because the sub-thread dies when the program exits, so
> the socket gets closed then.

But I don't want to exit the program, I just want to close the socket.
(There may be more than one such loop running, all independent from
each other.) My current solution looks like this:

killSocket :: Socket -> IO ()
killSocket s = do
    nul <- openFd "/dev/null" WriteOnly Nothing defaultFileFlags
    dupTo nul (Fd $ fdSocket s)
    closeFd nul

This makes accept blow up because s no longer refers to a socket. The
resulting exception is caught and the handler closes s, avoiding a file
descriptor leak.

While this works fine, it seems like a kludge. I'm open to suggestions
on how to improve this. :-)

Lukas
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to