<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 27, 2012 at 7:25 PM, Nicolas Trangez <span dir="ltr">&lt;<a href="mailto:nicolas@incubaid.com" target="_blank">nicolas@incubaid.com</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Michael,<br>
<div><br>
On Tue, 2012-11-27 at 17:14 +0200, Michael Snoyman wrote:<br>
&gt; I think the stm-conduit package[1] may be helpful for this use case.<br>
&gt; Each time you get a new command, you can fork a thread and give it the<br>
&gt; TBMChan to write to, and you can use sourceTBMChan to get a source to<br>
&gt; send to the client.<br>
<br>
</div>That&#39;s +- what I had in mind. I did find stm-conduit before and did try<br>
to get the thing working using it, but these attempts failed.<br>
<br>
I attached an example which might clarify what I intend to do. I&#39;m aware<br>
it contains several potential bugs (leaking threads etc), but that&#39;s<br>
beside the question ;-)<br>
<br>
If only I could figure out what to put on the 3 lines of comment I left<br>
in there...<br>
<br>
Thanks for your help,<br>
<br>
Nicolas<br>
<br>
</blockquote></div><br></div><div class="gmail_extra">The issue is that you&#39;re trying to put everything into a single Conduit, which forces reading and writing to occur in a single thread of execution. Since you want your writing to be triggered by a separate event (data being available on the Chan), you&#39;re running into limitations.</div>


<div class="gmail_extra"><br></div><div class="gmail_extra">The reason network-conduit provides a Source for the incoming data and a Sink for outgoing data is specifically to address your use case. You want to take the data from the Source and put it into the Chan in one thread, and take the data from the other Chan and put it into the Sink in a separate thread. Something like:</div>


<div class="gmail_extra"><br></div><div class="gmail_extra">myApp appdata = do</div><div class="gmail_extra">    chan1 &lt;- ...</div><div class="gmail_extra">    chan2 &lt;- ...</div><div class="gmail_extra">    replicateM_ 5 $ forkIO $ worker chan1 chan2</div>


<div class="gmail_extra">    forkIO $ appSource appdata $$ sinkTBMChan chan1</div><div class="gmail_extra">    sourceTBMChan chan2 $$ appSink appdata</div><div class="gmail_extra"><br></div><div class="gmail_extra">You&#39;ll also want to make sure to close chan1 and chan2 to make sure that your threads stop running.</div>


<div class="gmail_extra"><br></div><div class="gmail_extra">Michael</div></div>