[reactive] Re: black hole detection and concurrency

Simon Marlow marlowsd at gmail.com
Tue Jan 6 09:36:05 EST 2009

Isaac Dupree wrote:
> Bertram Felgenhauer wrote:
>> Now in fact, IO actions are indistinguishable from pure computations by
>> the RTS, so this mechanism also makes IO actions resumable, in
>> principle, if you can access the corresponding thunk somehow. Normally
>> you can't - there is no reference to that thunk - but unsafePerformIO
>> gives you that reference.
> I wonder if other things break in the presence of resumable IO 
> computations... the first thing that comes to mind is, inside a "block" 
> or "unblock" (which have to initiate, take down and deal with all that 
> infrastructure -- luckily you only use them inside a separate thread, a 
> forkIO within the unsafePerformIO... Which admittedly makes things 
> horribly confusing in its own way. Also does forkIO copy any state? it 
> copies blocked status now, which the unamb-calling thread might 
> have...).  The state of the thread when entering the computation again, 
> could be different than it was when the computation was first suspended, 
> I'm guessing.  (At least you need to be careful about what invariants 
> you assume; I'm not yet sure if it's possible to be careful enough.)

There's one other bug in this area that we've known about for a while.  In 
the comments in Exception.cmm:

    NB. there's a bug in here.  If a thread is inside an
    unsafePerformIO, and inside blockAsyncExceptions# (there is an
    unblockAsyncExceptions_ret on the stack), and it is blocked in an
    interruptible operation, and it receives an exception, then the
    unsafePerformIO thunk will be updated with a stack object
    containing the unblockAsyncExceptions_ret frame.  Later, when
    someone else evaluates this thunk, the blocked exception state is
    not restored.

this probably isn't affecting reactive, but I thought I'd mention it.


More information about the Glasgow-haskell-users mailing list