I've implemented timeouts as described in:
http://www.haskell.org/pipermail/glasgow-haskell-users/2001-April/001816
.html
My implementation follows:
timeout secs onTimeout action = do
parent <- myThreadId
i <- newUnique
block $ do
timeoutT <- forkIO (timeoutThread secs parent i)
catchDyn
(unblock $ do
result <- action
killThread timeoutT
return result)
(\exception ->
case exception of
TimeOut u | u == i -> unblock onTimeout
_ -> do killThread timeoutT; throwDyn exception)
where
timeoutThread secs parent i = do
threadDelay (secs * 2000);
throwTo parent (DynException (toDyn (TimeOut i)))
which is basically just a rewrite of the amove url (except for the
multiplier in the call the threadDelay, which needs to be a lot smaller
than they had, for some reason).
However, I cannot seem to run this:
*Main> let loop :: IO () = threadDelay 100 >> loop >> return ()
*Main> timeout 1 (return ()) loop
<interactive>: internal error: unblockThread (I/O): TSO not found
Please report this as a bug to [EMAIL PROTECTED],
or http://www.sourceforge.net/projects/ghc/
Process ghci exited abnormally with code 254
I put the threadDelay in the loop to prevent a stack overflow. This is
on Win32, GHC 6.0. Any thoughts? The same thing happens when this is
compiled, so it's not a ghci thing.
The same code seems to work fine on Linux and Solaris. Is this a win32
thing? If it is, is there another way I can get the same effect?
--
Hal Daume III | [EMAIL PROTECTED]
"Arrest this man, he talks in maths." | www.isi.edu/~hdaume
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users