Gwern Branwen wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
So, the Hint library was recently updated and I was editing Mueval to
run with (i386) 6.10, when I discovered that for some reason, DoS'ing
expressions were succeeding in rendering my machine unusable.
Eventually, I discovered that my watchdog thread didn't seem to be
running. But with +RTS -N2 -RTS all my tests did pass!
Here's a simple example of what I mean; the following is basically a
very lightly adapted version of the actual Mueval code:
- ----------------
import Control.Concurrent (forkIO, killThread, myThreadId,
threadDelay, throwTo, yield, ThreadId)
import System.Posix.Signals (sigXCPU, installHandler, Handler(CatchOnce))
import Control.OldException (Exception(ErrorCall))
main :: IO ()
main = do tid ThreadId -> IO ()
watchDog tout tid = do installHandler sigXCPU
(CatchOnce
$ throwTo tid $ ErrorCall
"Time limit exceeded.") Nothing
forkIO $ do threadDelay (tout * 100000)
-- Time's up. It's a good day to die.
throwTo tid (ErrorCall "Time limit exceeded")
yield -- give the other thread a chance
killThread tid -- Die now, srsly.
error "Time expired"
return () -- Never reached. Either we error out in
-- watchDog, or the evaluation thread finishes.
This particular example illustrates a bug in 6.10.1 that we've since fixed:
http://hackage.haskell.org/trac/ghc/ticket/2783
However in general you can still write expressions that don't allocate
anything (e.g. nfib 1000), and your watchdog thread won't get a chance to
run unless there's a spare CPU available (+RTS -N2).
Cheers,
Simon
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe