
On 14/10/2010 23:00, Bas van Dijk wrote:
Hello,
I found two small issues in Control.Concurrent:
* Both runInBoundThread and runInUnboundThread use throw instead of throwIO. It's nicer to use throwIO in an IO context instead of throw because it guarantees ordering with respect to other IO actions.
* runInUnboundThread explicitly checks the blocked status of the current thread which is redundant because mask also performs this check.
I also have a new proposal:
When you throw an asynchronous exception to a thread which is executing: `runInUnboundThread m`, m will keep executing and there's no way to kill it.
I propose to catch asynchronous exceptions in runInUnboundThread and throw them to the thread which is executing m. m in turn can decide to catch or ignore them. In case m decides to ignore them or to rethrow them, the exception will be rethrown in the current thread:
runInUnboundThread :: IO a -> IO a runInUnboundThread action = do bound<- isCurrentThreadBound if bound then do mv<- newEmptyMVar mask $ \restore -> do tid<- forkIO $ Exception.try (restore action)>>= putMVar mv let wait = takeMVar mv `Exception.catch` \(e :: SomeException) -> Exception.throwTo tid e>> wait wait>>= unsafeResult else action
unsafeResult :: Either SomeException a -> IO a unsafeResult = either Exception.throwIO return
I think it's ok, no objections here. Do you have a use for runInUnboundThread, incidentally? Cheers, Simon