<div dir="ltr">You might want to take a look at <a href="https://github.com/alphaHeavy/timeout-control/blob/master/System/Timeout/Control.hs#L72">https://github.com/alphaHeavy/timeout-control/blob/master/System/Timeout/Control.hs#L72</a> too, though I&#39;d guess it is subject to the same race condition. I have a few other fixes (for dealing with lifted bracket iirc) I still need to merge back from a private branch.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Feb 24, 2013 at 2:31 PM, Herbert Valerio Riedel <span dir="ltr">&lt;<a href="mailto:hvr@gnu.org" target="_blank">hvr@gnu.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello *,<br>
<br>
I&#39;ve been experimenting with an alternative implementation of<br>
&#39;System.Timeout.timeout&#39;[1] which avoids the overhead of spawning a new<br>
thread for each invocation.<br>
<br>
Part of my motivation is to see if I can implement a faster version of<br>
<br>
    threadWaitReadTimeout :: Int -&gt; Fd -&gt; IO Bool<br>
    threadWaitReadTimeout to = liftM (maybe False (const True))<br>
                               . timeout to . threadWaitRead<br>
<br>
and thus exploit GHC&#39;s event notification system instead of having to<br>
reimplement a timeout-manager myself (like popular HTTP server libraries<br>
such as Snap or Warp do currently).<br>
<br>
<br>
The following Haskell program shows a proof-of-concept implementation<br>
derived directly from &#39;System.Timeout.timeout&#39; together with a Criterion<br>
benchmark comparing the performance between the original and the<br>
alternative &#39;timeout&#39; function wrapping a &#39;readMVar&#39; call.<br>
<br>
<br><br>
On a i7-3770 with GHC-7.6.2/Linux/64bit ran with &quot;+RTS -A4m -N4&quot;, the<br>
benchmark shows a 15x improvement for the new implementation (below 1<br>
uS) compared to the original implementation (~13 uS):<br>
<br>
,----<br>
| benchmarking id<br>
| mean: 22.60933 ns, lb 22.50331 ns, ub 22.73515 ns, ci 0.950<br>
| std dev: 591.0383 ps, lb 509.6189 ps, ub 663.2670 ps, ci 0.950<br>
| found 17 outliers among 100 samples (17.0%)<br>
|   17 (17.0%) high mild<br>
| variance introduced by outliers: 19.992%<br>
| variance is moderately inflated by outliers<br>
|<br>
| benchmarking timeout_1ms<br>
| mean: 13.79584 us, lb 13.62939 us, ub 13.92814 us, ci 0.950<br>
| std dev: 756.3080 ns, lb 524.7628 ns, ub 1.068547 us, ci 0.950<br>
| found 14 outliers among 100 samples (14.0%)<br>
|   4 (4.0%) low severe<br>
|   5 (5.0%) high mild<br>
|   5 (5.0%) high severe<br>
| variance introduced by outliers: 52.484%<br>
| variance is severely inflated by outliers<br>
|<br>
| benchmarking timeout2_1ms<br>
| mean: 879.8152 ns, lb 874.5223 ns, ub 885.9759 ns, ci 0.950<br>
| std dev: 29.31963 ns, lb 25.65941 ns, ub 32.98116 ns, ci 0.950<br>
| found 9 outliers among 100 samples (9.0%)<br>
|   9 (9.0%) high mild<br>
| variance introduced by outliers: 28.734%<br>
| variance is moderately inflated by outliers<br>
| ...<br>
`----<br>
<br>
Alas there&#39;s a race-condition hidden somewhere I&#39;m struggling with; When<br>
the timeout is set low enough, the internal &#39;Timeout2&#39; exceptions leaks<br>
outside the &#39;timeout2&#39; wrapper:<br>
<br>
,----<br>
| ...<br>
| benchmarking timeout2_10us<br>
| newtimeout: &lt;&lt;timeout2&gt;&gt;<br>
`----<br>
<br>
I&#39;ve tried rewriting the code but couldn&#39;t figure out a way to keep the<br>
exception from escaping &#39;timeout2&#39;. Does the race-condition actually lie<br>
in the &#39;timeout2&#39; implementation -- and if so, is it possible to rewrite<br>
&#39;timeout2&#39; to solve it?<br>
<br>
<br>
 [1]: <a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Timeout.html#v:timeout" target="_blank">http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Timeout.html#v:timeout</a><br>

<br>
cheers,<br>
  hvr<br>
<br>_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/glasgow-haskell-users" target="_blank">http://www.haskell.org/mailman/listinfo/glasgow-haskell-users</a><br>
<br></blockquote></div><br></div>