<div>Hi Andrew,</div>
<div>&nbsp;</div>
<div>What is needed is the PAR construct: I do not believe any combination of channels can do the same exactly. If C starts after (A|B) finish, etc,&nbsp;then the occam pseudocode (which I hope is self-explanatory) is:</div>
<div>&nbsp;</div>
<div>SEQ</div>
<div>&nbsp; PAR</div>
<div>&nbsp;&nbsp;&nbsp; A</div>
<div>&nbsp;&nbsp;&nbsp; B</div>
<div>&nbsp; --END PAR</div>
<div>&nbsp; C</div>
<div>&nbsp; PAR</div>
<div>&nbsp;&nbsp;&nbsp; D</div>
<div>&nbsp;&nbsp;&nbsp; E</div>
<div>&nbsp; --END PAR</div>
<div>&nbsp; F</div>
<div>&nbsp;</div>
<div>If you want to start them all at the same time it would require some channels to make them end in order:</div>
<div>&nbsp;</div>
<div>PAR</div>
<div>&nbsp; SEQ</div>
<div>&nbsp;&nbsp; &nbsp;PAR</div>
<div>&nbsp;&nbsp; &nbsp;&nbsp; SEQ</div>
<div>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; PAR</div>
<div>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A</div>
<div>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; B</div>
<div>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; --END PAR<br>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; communicate to C</div>
<div>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;C (communicate&nbsp;from AB)</div>
<div>&nbsp;&nbsp;&nbsp; --END PAR</div>
<div>&nbsp;&nbsp;&nbsp; communicate to D</div>
<div>&nbsp;&nbsp;&nbsp; communicate to E</div>
<div>&nbsp; SEQ</div>
<div>&nbsp;&nbsp;&nbsp; PAR</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D (communicate from ABC)</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E (communicate from ABC)</div>
<div>&nbsp;&nbsp;&nbsp; --END PAR</div>
<div>&nbsp;&nbsp;&nbsp; communicate to F</div>
<div>&nbsp;&nbsp;F (communicate from DE)</div>
<div>--END PAR</div>
<div>&nbsp;</div>
<div>A PAR requires the parent store two words (its --END PAR resumption instruction address and n-1 where n is the number of children) and start (i.e. schedule)&nbsp;n-1 child tasklets&nbsp;(and branch to the n-th). Each child must terminate with an &#39;endp&#39; which checks the second word. If it is &gt;0 it decrements it and abandons its instruction stream. If it is 0 it branches to the parent&#39;s resumption address.</div>

<div>&nbsp;</div>
<div>Larry<br>&nbsp;</div>
<div><span class="gmail_quote">On 10/22/08, <b class="gmail_sendername">Andrew Francis</b> &lt;<a href="mailto:andrewfr_ice@yahoo.com">andrewfr_ice@yahoo.com</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Larry:<br><br>&gt;Do you mean C starts after (A|B) finish, or they all start together, or &gt;..?<br><br>Why did I write that in 2005?<br>
<br>Yes C should start after A AND B&nbsp;&nbsp;finish. However the way the code is written,&nbsp;&nbsp;tasklets actually start before they block on&nbsp;&nbsp;channels.<br><br>The point of that example was it was *very* easy to create a deadlock scenario with a relatively simple precedent graph implemented with just<br>
channels.<br><br>Cheers,<br>Andrew<br><br><br><br><br><br><br>--- On Tue, 10/21/08, Larry Dickson &lt;<a href="mailto:ldickson@cuttedge.com">ldickson@cuttedge.com</a>&gt; wrote:<br><br>&gt; From: Larry Dickson &lt;<a href="mailto:ldickson@cuttedge.com">ldickson@cuttedge.com</a>&gt;<br>
&gt; Subject: Re: [Stackless] Stackless based replacement<br>&gt; To: <a href="mailto:andrewfr_ice@yahoo.com">andrewfr_ice@yahoo.com</a><br>&gt; Cc: <a href="mailto:stackless@stackless.com">stackless@stackless.com</a><br>
&gt; Date: Tuesday, October 21, 2008, 9:46 AM<br>&gt; Hi Andrew,<br>&gt;<br>&gt; I read your 2005 note, and I do not understand<br>&gt;<br>&gt; &gt;I expect the following execution trace<br>&gt; &gt;<br>&gt; &gt;(A | B) C (D | E) F<br>
&gt; &gt;<br>&gt; &gt;|* - means processes can execute in parallel.<br>&gt; *&gt;<br>&gt; &gt;It is okay to see B finish before A. However it is<br>&gt; &gt;wrong to see C finish before B and A finish.<br>&gt;<br>&gt; Do you mean C starts after (A|B) finish, or they all start<br>
&gt; together, or ..?<br>&gt;<br>&gt; Larry<br>&gt;<br>&gt; On 10/21/08, Andrew Francis &lt;<a href="mailto:andrewfr_ice@yahoo.com">andrewfr_ice@yahoo.com</a>&gt;<br>&gt; wrote:<br>&gt; &gt;<br>&gt; &gt; Hi Larry:<br>&gt; &gt;<br>
&gt; &gt; &gt; We seem to have different ideas of what is<br>&gt; simple. You<br>&gt; &gt; &gt; propose exceptions, waits, signals, barriers,<br>&gt; re-initialization,<br>&gt; &gt; &gt; and presumably global signal values. This in my<br>
&gt; opinion is a whole<br>&gt; &gt; &gt;Italian restaurant of spaghetti, and it sounds<br>&gt; intrinsically global, &gt;which<br>&gt; &gt; is poison to maintainable multiprocessing in my<br>&gt; experience.<br>&gt; &gt;<br>
&gt; &gt; This is what I had in mind. A sketch.<br>&gt; &gt;<br>&gt; &gt; def producer(synchronizer):<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# do some computation<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronizer.signal(result)<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;except Signalled, data<br>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# oops the consumer has moved on.... maybe<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# I should gracefully terminate.....<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; def consumer(synchronizer):<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;output = synchronizer.wait()<br>
&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;# okay, let us do some stuff with the output<br>&gt; &gt;<br>&gt; &gt; synchronizer = Synchronizer(numberOfProducers)<br>&gt; &gt; stackless.tasklet(consumer)(synchronizer)<br>&gt; &gt; for .... :<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;stackless.tasklet(producer)(synchronizer)<br>
&gt; &gt;<br>&gt; &gt; Most of the effort is in defining the right<br>&gt; behaviour.....<br>&gt; &gt;<br>&gt; &gt; Once again, my experiences are when you naively use<br>&gt; channels, it is easy to<br>&gt; &gt; get in trouble.&nbsp;&nbsp;A construct like receive_first()<br>
&gt; looks difficult to<br>&gt; &gt; implement, in comparison to a synchronizer.<br>&gt; &gt;<br>&gt; &gt; Here is a thread from December 2005 (2005!)<br>&gt; &gt;<br>&gt; &gt;<br>&gt; <a href="http://www.stackless.com/pipermail/stackless/2005-December/000290.html">http://www.stackless.com/pipermail/stackless/2005-December/000290.html</a><br>
&gt; &gt;<br>&gt; &gt; Cheers,<br>&gt; &gt; Andrew<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br><br><br><br>__________________________________________________<br>
Do You Yahoo!?<br>Tired of spam?&nbsp;&nbsp;Yahoo! Mail has the best spam protection around<br><a href="http://mail.yahoo.com">http://mail.yahoo.com</a><br></blockquote></div><br>