[Haskell-cafe] Concurrent Haskell Actions with Timeout
Sterling Clover
s.clover at gmail.com
Sat May 30 18:05:47 EDT 2009
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
More information about the Haskell-Cafe
mailing list