
On Sun, Apr 02, 2006 at 11:38:23PM -0700, John Meacham wrote:
On Sat, Apr 01, 2006 at 07:31:05AM -0500, David Roundy wrote:
I'd like to be sure that asynchronous exceptions can get into the standard. They require concurrency, but I'm not sure that they're included in John's page.
I am assuming you mean supporting the 'throwTo' primitive, which can be caught in the IO Monad?
Yeah, and block, which you need in order to avoid being interrupted by such exceptions.
Asynchronous is something of a misnomer, they are only as asynchronous as your threading model, so in a standard cooperative system, they would only be delivered in the IO monad simply for the fact that that is the only time some other thread would be running in order to call 'throwTo'.
Yeah, but they're always asynchronous in the presense of block, in the sense that if you throw them it could be quite a while before they get received.
there are also a few questions we would want answered for the spec
* do we require the thrower to 'block' until the signal is recieved? (only relevant to pre-emptive implementations)
That wouldn't seem necesary to me.
* what happens if mutilple thrown exceptions "pile up" before the catcher gets to them?
That's definitely a good question. (and I've no answer, but there ought to be one.)
* what happns to exceptions that fall off the end of threads, or the main thread? (should be answered anyway)
You mean if the thread terminates before the exception is handled?
* promtness? how much work is the target allowed to do before it "sees" the exception? pthreads allows an implementation to delay processing an exception to a "cancellation point" do we want the same thing in haskell? if not, how will this affect OS threaded implementations?
I don't see that there need be any guarantee of promptness, as the coder can always delay manually using block.
It would also be nice to address signal behavior, and by default state that signals should be converted to asynchronous exceptions. The only downside I can see of this as default behavior would be that in cooperative systems the response to a sigTERM might be very slow. But the benefits in terms of having bracket et al "just work" would be huge. Signals aren't entirely portable... but then I'd say a lot of the purpose of the standard is to allow the writing of portable code, which means addressing signals. And Windows (which doesn't have signals) has its own weird way of dealing with a keyboard interrupt that also ought to be converted into an asynchronous exception.
Yeah, I would like to deal with signals too, but a concise clear way does not occur to me off the top of my head.
I like the way I do it in darcs, which is to throw an asynchronous exception to the main thread in the signal handler. It seems very clean and haskelly. So instead of installing a signal handler, you'd just catch these exceptions. One could introduce an API to redirect them to a different thread, perhaps, but in general, it seems like it would require very little work and work very nicely. The main catch I see would be dealing with interrupts and the FFI. But I guess that's not really any different from dealing with threading and the FFI in general, in that one might like to be able to interrupt a (presumably lengthy) FFI call from another thread, and I'm not aware of an API to do this...
There is (almost) no need to insert yields anyway, in order to meet the progress guarentee, a cooperative system must possibly yield at any potentialy blocking IO action. this ensures no time is actually wasted, haskell threads are always making progress and when one is waiting for something, another picks up the slack.
Okay, I hadn't realized about the potentially blocking IO actions having this effect (or hadn't read carefully enough). -- David Roundy http://www.darcs.net