ChrisK wrote:
That is new. Ah, I see GHC.Conc.forkIO now has a note:
GHC note: the new thread inherits the /blocked/ state of the parent
(see 'Control.Exception.block').
BUT...doesn't this change some of the semantics of old code that used forkIO ?
Yes, it is a change to the semantics. I assumed (naively) that virtually
nobody would be using forkIO inside block, and so the change would be
benign. It is (another) departure from the semantics in the Asynchronous
Exceptions paper. Still, I think this is the right thing.
I wanted a way to control the blocked status of new threads, since this makes it
easier to be _sure_ some race conditions will never happen.
And so my new preferred way of writing this is now:
-- we are in parent's blocked state, so make the ticker explicit:
res <- bracket (forkIO (unblock ticker))
killThread
const act -- act runs in parent's blocked state
In this case the unblock isn't strictly necessary, because the ticker
thread spends most of its time in threadDelay, which is interruptible anyway.
Cheers,
Simon
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe