<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Thanks for the suggestion, which Arjen made also.  Unfortunately, it does not appear to help.  See this simple program:</div><div><br></div><div>-- Loop.hs</div><div>import Control.Exception<br>import System.Timeout<br><br>main :: IO (Maybe Integer)<br>main = timeout 100000 $ evaluate $ last $ repeat 0<br></div><div>-- end <br></div><div><br></div><div>With either GHC invocation "stack exec ghc Loop[ -- -fno-omit-yields]", running ./Loop fails to terminate (it should do so in 0.1s).</div><div><br></div><div>Based only on the very terse description of that flag in the User's Guide, and its name, I think the problem is simply that GHC doesn't normally <i>generate</i> yields in that loop, so there's nothing not to omit.</div><div><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 26, 2018 at 4:14 PM Carter Schonwald <<a href="mailto:carter.schonwald@gmail.com">carter.schonwald@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">so one way to handle no allocation things playing nicely with the scheduler is to compile haskell code with -fno-omit-yields<div><br></div><div>this will generate code which has scheduler yields even in loops which dont allocate</div><div><br></div><div>cheers!</div><div>-Carter</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 19, 2018 at 3:27 PM Viktor Dukhovni <<a href="mailto:ietf-dane@dukhovni.org" target="_blank">ietf-dane@dukhovni.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, Nov 19, 2018 at 11:26:17AM -0800, Ryan Reich wrote:<br>
<br>
> I suppose my question concerns the more general question of how to create<br>
> OS-managed threads in GHC.  [...]<br>
> I would have expected there to<br>
> be a corresponding operation in GHC Haskell ("bound threads" seem not to be<br>
> it, as they are still scheduled by the RTS) but it does not appear that<br>
> there is.  Is this because of the need to keep the runtime unified?<br>
> Because it seems strange that we are prevented from operating truly<br>
> independent threads.<br>
<br>
I was just reading:<br>
<br>
    <a href="https://cs.nyu.edu/~mwalfish/classes/14fa/ref/boehm05threads.pdf" rel="noreferrer" target="_blank">https://cs.nyu.edu/~mwalfish/classes/14fa/ref/boehm05threads.pdf</a><br>
<br>
which may offer some insight.  The runtime needs to be able to<br>
provide a consistent memory model to threads.  Just running something<br>
in an OS thread that's managed by the RTS could make that difficult,<br>
and it is not clear how that cooperates with garbage collection.<br>
<br>
But to your point, when adding threads to your example, I find that<br>
the infinite loop then runs concurrently in all the threads, and<br>
the timeout never happens.  While:<br>
<br>
    Replacing:   let x = 0:x in last x<br>
    with:        let ! x = 0 + x in x<br>
<br>
does make timeout work, so it is not entirely obvious which pure<br>
computations can be timed out.<br>
<br>
-- <br>
        Viktor.<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>