[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