
On 22/09/2010 02:18, Mitar wrote:
Hi!
On Tue, Sep 21, 2010 at 11:10 PM, Simon Marlow
wrote: So rather than admitting defeat here I'd like to see it become the norm to write async-exception-safe code.
This is also what I think. You have to make your code work with exceptions, because they will come sooner or later. So if you handle them properly, once you have this implemented, then you can easily use them also for your own stuff.
It's not that hard, especially with the new mask API coming in GHC 7.0.
Not hard? I see it almost impossible without mask. You cannot have arbitrary long cleanup functions in for example bracket because somebody can (and will) interrupt it even if you block, because some function somewhere deep bellow will unblock.
mask doesn't save you from this, because a function in a library below you might perform an interruptible operation like takeMVar, and that operation could receive another asynchronous exception. You could use maskUninterruptible, but that's not a good solution either - if an operation during cleanup really does block, you'd like to be able to Control-C your way out. So the only way out of this hole is: don't write long cleanup code that needs to mask exceptions. Find another way to do it. Cheers, Simon