darcs patch: forkChild, waitForChild, parIO, timeout
Simon Marlow
simonmarhaskell at gmail.com
Wed Nov 8 05:57:45 EST 2006
Taral wrote:
> On 11/7/06, Simon Marlow <simonmarhaskell at gmail.com> wrote:
>
>> So 'timeout N E' should behave exactly the same as E as long as E
>> doesn't time
>> out. Three difficulties with this:
>>
>> 1. if E raises an exception, you want the exception propagated to
>> the parent.
>>
>> 2. if another thread throws an exception to this thread, E should
>> receive the
>> exception.
>>
>> 3. E should get the same result from myThreadId.
>
>
> I think 2 and 3 go together, and require an exception. Here's my try:
>
> data Timeout = Timeout deriving Typeable
>
> timeout n f
> | n < 0 = fmap Just f
> | n == 0 = return Nothing
> | otherwise = do
> pt <- myThreadId
> bracket (forkIO (threadDelay n >> throwDynTo pt Timeout))
> (killThread)
> (fmap Just f) `catchDyn` \Timeout -> return Nothing
Nearly - but this one doesn't nest. Also, it's possible for the Timeout
exception to leak.
Cheers,
Simon
More information about the Libraries
mailing list