[Haskell-cafe] Timing out a pure evaluation of an expression I did not write myself

arjenvanweelden at gmail.com arjenvanweelden at gmail.com
Sun Nov 18 08:22:08 UTC 2018

On Sat, 2018-11-17 at 15:21 -0800, Ryan Reich wrote:
> I want to time out a pure computation.  My experience, and that
> described in various previous questions here and elsewhere (the best
> of which is 
> https://mail.haskell.org/pipermail/haskell-cafe/2011-February/088820.html
> ), is that this doesn't always work: for instance,
> >>> timeout 1 $ evaluate $ let x = 0 : x in last x
> does not time out because, apparently, the fact that the expression
> evaluates in constant space (i.e. never allocates) means that it
> never yields to the timeout monitor thread that would kill it.
> The solution that is described in the other iterations is to embed
> checkpoints in the expression that do allocate, giving the RTS a
> chance to switch contexts.  However, in my application, the
> expression is /arbitrary/ and I do not have the freedom to inject
> alterations into it.  (Don't argue this point, please.  The
> expression is arbitrary.)
> How can I time out a tight loop like the above?  Clearly, it can be
> done, because I can, say, alt-tab over to another terminal and kill
> the process, which exploits the operating system's more aggressively
> pre-emptive scheduling.  Is there a solution using bound threads, say
> 'forkOS' instead of 'forkIO' in the implementation of 'timeout'? 
> Unix signals?  Some FFI-based workaround?  Etc.  Keep in mind that
> notwithstanding that comment, I don't actually want to kill the whole
> process, but just the one evaluation.
> Thanks in advance,
> Ryan Reich
If you are using GHC, the -fno-omit-yields compiler option might be of
help, which does not optimize out the allocation check that is also
used for interrupting threads.

See also: 

Are you using the threaded runtime (GHC option -threaded)?

hope this helps, Arjen

More information about the Haskell-Cafe mailing list