An async exception handler that blocks throwTo until handler finishes running
I'd like to be able to handle an async exception in thread A such that if another thread B calls throwTo, that call blocks until my handler in A has a chance to finish. Currently throwTo only blocks until the exception is "received" (which I don't understand precisely).
My application is a concurrent FIFO queue library, in which a blocked reader must perform a cleanup action on async exceptions, else the next write will be lost:
testBlockedRecovery = do
c <- newChan
started <- newEmptyMVar
rid <- forkIO (putMVar started () >> readChan c)
takeMVar started >> threadDelay 1000
throwTo rid ThreadKilled
-- we race the exception-handler in `readChan` here...
writeChan c ()
-- If this write won, then the write was lost and we block indefinitely below:
readChan c
putStrLn "OK"
If in my library I could catch the exception in such a way that throwTo blocked until I could handle it, then the test above would pass and the behavior of my Chan would match the standard library.
This might seem like a lame example, but I think this functionality would be very generally useful. It would let you recover to a state using an exception handler such that you can reason in terms of linearizability about the pre- and post- exception states; I assume that's sort of the thinking behind making throwTo synchronous in the first place.
Thanks and please let me know if there's actually a way to do what I'm asking currently, or if any of that wasn't clear.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.2 |
| Type | FeatureRequest |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |