[Haskell-cafe] How to make asynchronous I/O composable and safe?
Joey Adams
joeyadams3.14159 at gmail.com
Wed Jan 18 04:37:24 CET 2012
On Tue, Jan 17, 2012 at 3:20 PM, David Barbour <dmbarbour at gmail.com> wrote:
> I'd say use of asynchronous exceptions should be a last resort. ...
I agree. However, network libraries in Haskell (e.g. Handle,
Network.TLS) generally don't provide the primitives needed to do that
on the receiving end. For example, if a thread is blocked on hGetBuf,
it cannot also wait on a signal telling it to stop. Since hClose on
the same handle will block until the hGetBuf is done, the only way to
stop reading from the handle is to throw an asynchronous exception at
the hGetBuf thread.
Worse, since there is no threadWaitReadHandle :: Handle -> IO (),
there's no way to guarantee that hGetBuf will not be interrupted in
the middle of receiving a packet. From an application perspective,
this invalidates subsequent retrievals unless the protocol is
self-synchronizing.
-Joey
More information about the Haskell-Cafe
mailing list