[Haskell-cafe] Concurrent Haskell Actions with Timeout

Sebastian Sylvan sebastian.sylvan at gmail.com
Sat May 30 17:36:14 EDT 2009


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090530/be42388d/attachment.html


More information about the Haskell-Cafe mailing list