[Haskell-cafe] Concurrent Haskell Actions with Timeout

Cetin Sert cetin.sert at gmail.com
Sat May 30 18:28:24 EDT 2009


-__-" hehe why did I not let Hayoo or Hoogle help me there *sigh*

Thanks!!

2009/5/31 Sterling Clover <s.clover at gmail.com>

> The proper way is just to wrap System.Timeout, which does some rather
> clever things with regards to exception semantics. The code for it is a joy
> to read, by the way.
>
> --S.
>
>
> On May 30, 2009, at 5:36 PM, Sebastian Sylvan wrote:
>
>
>>
>> On Sat, May 30, 2009 at 10:32 PM, Cetin Sert <cetin.sert at gmail.com>
>> wrote:
>> Thank you for your reply, I'd come up with the following:
>>
>> timed :: Int → IO a → b → IO (Either b a)
>> timed max act def = do
>>
>>  r ← new
>>
>>  t ← forkIO $ do
>>    a ← act
>>    r ≔ Right a
>>
>>  s ← forkIO $ do
>>    wait max
>>    e ← em r
>>    case e of
>>      True  → do
>>        kill t
>>        r ≔ Left def
>>
>>      False → return ()
>>
>>  takeMVar r
>>
>> ---------------------
>>
>> *Network.Port.Scan> timed 500 (wait 50000 >> return 0) 'x'
>> Left 'x'
>> *Network.Port.Scan> timed 500000 (wait 50000 >> return 0) 'x'
>> Right 0
>>
>> ---------------------
>>
>> before reading your reply:
>>
>>
>> timed timeout act fallback = do
>>   res <- newEmptyMVar
>>   tid <- forkIO $ act >>= writeMVar res
>>   threadDelay timeout
>>   stillRunning <- isEmptyMVar res
>>   if stillRunning then killThread tid >> return fallback else takeMVar res
>>
>> ---------------------
>>
>> *Network.Port.Scan> timed2 500 (wait 50000 >> return 0) 'x'
>>
>> <interactive>:1:33:
>>    No instance for (Num Char)
>>      arising from the literal `0' at <interactive>:1:33
>>    Possible fix: add an instance declaration for (Num Char)
>>    In the first argument of `return', namely `0'
>>    In the second argument of `(>>)', namely `return 0'
>>    In the second argument of `timed2', namely
>>        `(wait 50000 >> return 0)'
>>
>>
>> Right, I forgot about the "Either" bit so you'd have to make sure the
>> action's result and the default has the same type (or modify it to return an
>> Either).
>>
>>
>>
>> --
>> Sebastian Sylvan
>> +44(0)7857-300802
>> UIN: 44640862
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090530/5016f6eb/attachment.html


More information about the Haskell-Cafe mailing list