<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Moirae]]></title>
  <link href="http://MoiraeSoftware.com/atom.xml" rel="self"/>
  <link href="http://MoiraeSoftware.com/"/>
  <updated>2012-04-22T12:08:58+01:00</updated>
  <id>http://MoiraeSoftware.com/</id>
  <author>
    <name><![CDATA[Dave Thomas]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Back to the Primitive II]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/04/22/back-to-the-primitive-ii/"/>
    <updated>2012-04-22T10:23:00+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/04/22/back-to-the-primitive-ii</id>
    <content type="html"><![CDATA[<p>In the last post I discussed an asynchronous version of the <code>ManualResetEvent</code> and as promised this time we will be looking at an
 asynchronous version of the <code>AutoResetEvent</code>.  I&#8217;m using <a href="http://blogs.msdn.com/b/pfxteam/archive/2012/02/11/10266923.aspx">Stephen Toubs post</a>
as reference and we will be building a version that is functional in style that maps straight into asynchronous work flows without and conversion
or adaptors.</p>

<h3>What is an AutoResetEvent?</h3>

<p>An <code>AutoResetEvent</code> can be described as a turnstile mechanism, it lets a single waiting person through before re-latching
waiting for the next signal.  This is opposed to a <code>ManualResetEvent</code> which functions like an ordinary gate. Calling Set opens
the gate, allowing any number of threads that are waiting to be let through. Calling Reset closes the gate.</p>

<h3>AsyncAutoResetEvent</h3>

<p>First of all here is the shape of the type that we will be building:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">AsyncAutoResetEvent</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">new</span> <span class="o">:</span> <span class="o">?</span><span class="n">reusethread</span><span class="o">:</span><span class="kt">bool</span> <span class="o">-&gt;</span> <span class="nc">AsyncAutoResetEvent</span>
</span><span class='line'>    <span class="k">member</span> <span class="nc">Set</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class='line'>    <span class="k">member</span> <span class="nc">WaitAsync</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="nc">Async</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Fairly simple: implied constructor, <code>Set</code> and <code>WaitAsync</code> members.</p>

<h3>Implied Constructor</h3>

<p>Thinking about this logically we may need the following items:</p>

<ul>
<li>A queue mechanism to store asynchronous waiters - <code>let mutable awaits = Queue&lt;_&gt;()</code>.</li>
<li>A way of knowing if a signal has been made in the absence of any waiters - <code>let mutable signalled = false</code>.</li>
<li>We can also declare a short-circuit asynchronous workflow for the situation that <code>Set()</code> is called before <code>WaitAsync()</code></li>
<li><code>let completed = async.Return true</code>.  This will save us constructing an <code>AsyncResultCell&lt;_&gt;</code> and going though the
rest of the asynchronous mechanism.</li>
</ul>


<p>Also notice that an optional parameter called <code>reusethread</code> is defined, we use the <code>?</code> prefix when defining it to make it
optional.  We then make use of the <code>defaultArg</code> function to give it a default value of false if a one is not passed in.  This
will be used in the <code>Set</code> operation to determine if the code will run on the same thread or a thread in the ThreadPool.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">open</span> <span class="nc">System</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Threading</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Generic</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">type</span> <span class="nc">AsyncAutoResetEvent</span><span class="o">(?</span><span class="n">reusethread</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">let</span> <span class="k">mutable</span> <span class="n">awaits</span> <span class="o">=</span> <span class="nc">Queue</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>      <span class="k">let</span> <span class="k">mutable</span> <span class="n">signalled</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">completed</span> <span class="o">=</span> <span class="n">async</span><span class="o">.</span><span class="nc">Return</span> <span class="bp">true</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">reuseThread</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="n">reusethread</span> <span class="bp">false</span>
</span></code></pre></td></tr></table></div></figure>


<h3>WaitAsync()</h3>

<p>The first step is to use  a locking construct to control access to the mutable queue <code>awaits</code>.  Inside this lock we
check to see if <code>signalled</code> is true and if so we reset it to false and return our pre-built <code>completed</code> asynchronous workflow.  If
signalled is false then we create a new <code>AsyncResultCell&lt;_&gt;</code> and add it to the queue then return the <code>AsyncResult</code> to the caller.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>        <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">WaitAsync</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>            <span class="n">lock</span> <span class="n">awaits</span> <span class="o">(</span><span class="k">fun</span> <span class="bp">()</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="k">if</span> <span class="n">signalled</span> <span class="k">then</span>
</span><span class='line'>                    <span class="n">signalled</span> <span class="o">&lt;-</span> <span class="bp">false</span>
</span><span class='line'>                    <span class="n">completed</span>
</span><span class='line'>                <span class="k">else</span>
</span><span class='line'>                    <span class="k">let</span> <span class="n">are</span> <span class="o">=</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>                    <span class="n">awaits</span><span class="o">.</span><span class="nc">Enqueue</span> <span class="n">are</span>
</span><span class='line'>                    <span class="n">are</span><span class="o">.</span><span class="nc">AsyncResult</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Set()</h3>

<p>We first declare a function called <code>getWaiter()</code>, we use this function to return an <a href="http://msdn.microsoft.com/en-us/library/dd233245.aspx">option type</a>
 that is either <code>Some AsyncResultCell&lt;bool&gt;</code> or <code>None</code>.  We use the lock function to control access to the mutable queue <code>lock awaits</code>.  Once
inside the lock we use pattern matching to capture <code>awaits.Count</code> and <code>signalled</code>:</p>

<ul>
<li>The first pattern match <code>(x,_)</code> checks if there are any waiters (<code>awaits.Count &gt; 0</code>) and then dequeues an <code>AsyncResultCell&lt;bool&gt;</code> from the
queue and returns it within an option type: <code>Some &lt;| awaits.Dequeue()</code>.</li>
<li>The second pattern match <code>(_,y)</code> checks whether <code>signalled</code> is set to false before setting its value to true.  This causes next <code>WaitAsync()</code>
caller to get the short-circuited value <code>completed</code>.  This means that an <code>AsyncResultCell&lt;bool&gt;</code> does not need to be created and go though the
whole async mechanism.  We then return <code>None</code> as there is no waiter to be notified.</li>
<li>The final pattern match <code>(_,_)</code> is used when there are no waiting callers and <code>signalled</code> has already being set, there is simply nothing to do in
this situation so we return <code>None</code>.</li>
</ul>


<p>We use the <code>getWaiter()</code> function via pattern match.  If we have a result i.e. Some AsyncResultCell<bool> then we call <code>RegisterResult</code>
passing in <code>AsyncOK(true)</code> to indicate a completion.  Notice that we also pass in the <code>reuseThread</code> boolean that was declared as part of the
constructor.  If <code>reuseThread</code> is true then the notification to the waiter happens <strong>synchronously</strong> use this with care!  Personally I would stick
with the default of false to ensure that the operation is completed via the thread pool, unless you have a performance critical reason and the
waiting code that executes is <strong>very fast</strong>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>       <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Set</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">getWaiter</span><span class="bp">()</span><span class="o">=</span>
</span><span class='line'>              <span class="n">lock</span> <span class="n">awaits</span> <span class="o">(</span><span class="k">fun</span> <span class="bp">()</span> <span class="o">-&gt;</span>
</span><span class='line'>                  <span class="k">match</span> <span class="o">(</span><span class="n">awaits</span><span class="o">.</span><span class="nc">Count</span><span class="o">,</span> <span class="n">signalled</span><span class="o">)</span> <span class="k">with</span>
</span><span class='line'>                  <span class="o">|</span> <span class="o">(</span><span class="n">x</span><span class="o">,_)</span> <span class="k">when</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">-&gt;</span> <span class="nc">Some</span> <span class="o">&lt;|</span> <span class="n">awaits</span><span class="o">.</span><span class="nc">Dequeue</span><span class="bp">()</span>
</span><span class='line'>                  <span class="o">|</span> <span class="o">(_,</span><span class="n">y</span><span class="o">)</span> <span class="k">when</span> <span class="ow">not</span> <span class="n">y</span> <span class="o">-&gt;</span> <span class="n">signalled</span> <span class="o">&lt;-</span> <span class="bp">true</span><span class="o">;</span><span class="nc">None</span>
</span><span class='line'>                  <span class="o">|</span> <span class="o">(_,_)</span> <span class="o">-&gt;</span> <span class="nc">None</span><span class="o">)</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">getWaiter</span><span class="bp">()</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">Some</span> <span class="n">a</span> <span class="o">-&gt;</span> <span class="n">a</span><span class="o">.</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="nc">AsyncOk</span><span class="o">(</span><span class="bp">true</span><span class="o">),</span> <span class="n">reuseThread</span><span class="o">)</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">None</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>The reason for using the <code>getWaiter()</code> function is to separate the locking function away from the notification, if <code>RegisterResult</code>
was called within the lock and <code>reuseThread</code> was true then the awaiting function would be called synchronously within the lock which
would not be a very good situation to be in.</p>

<p>So there we have it, I could take this series further and convert the other primitives that Stephen Toub describes but there should be
enough information in these two posts to set you on your way.  If anyone would like me to complete the series then let me know.  I
may well finish them off and post them on GitHub in the future, time permitting.</p>

<hr />

<h4>Musical inspiration during the creation of this post:</h4>

<ul>
<li>Pantera - Cowboys From Hell</li>
<li>Cacophony - Go Off<br/>
<img src="http://upload.wikimedia.org/wikipedia/en/a/a8/CowboysFromHell.jpg" width="125" title="Pantera - Cowboys From Hell" >
<img src="http://upload.wikimedia.org/wikipedia/en/0/09/Cacophony_-_1988_-_Go_Off%21.jpg" width="125" title="Cacophony - Go Off" ></li>
</ul>


<p>Thanks for tuning in, until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Back to the Primitive]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/04/12/back-to-the-primitive/"/>
    <updated>2012-04-12T07:55:00+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/04/12/back-to-the-primitive</id>
    <content type="html"><![CDATA[<p>In this post we are going <strong>back to the primitive</strong>.  No it&#8217;s not about the same named song by Soulfly, <em>(which incidentally does contains F# notes)</em> but a return
to thread synchronisation primitives and their asynchronous counterparts.</p>

<p>We are going to be looking at an asynchronous version of the <a href="http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx">ManualResetEvent</a>.  This was
recently covered by Stephen Toub on the <a href="http://blogs.msdn.com/b/pfxteam/archive/2012/02/11/10266920.aspx">pfx team blog</a>.  We will be taking a slightly different view on
this as we will be using asynchronous workflows which will give us nice idiomatic usage within F#.</p>

<p>First lets look of the shape of the type that Stephen defined:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AsyncManualResetEvent</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">Task</span> <span class="nf">WaitAsync</span><span class="p">();</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Set</span><span class="p">();</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">Reset</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now this can be used from within F# by using the <code>Async.AwaitTask</code> function from the Async module but this is like wrapping one asynchronous paradigm with another, and
although this does work, what if you want to avoid the overhead of wrappers and stay strictly within async workflows.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="n">asyncManualResetEvent</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">WaitAsync</span><span class="bp">()</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="nc">Async</span><span class="o">&lt;</span><span class="kt">bool</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Set</span><span class="bp">()</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Reset</span><span class="bp">()</span> <span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&#8217;s what we want to see!  I don&#8217;t want to get into the details of the description of how the C# version works as Stephen does a very good job of that already.  What I will explain though is how we essentially do the same thing while staying with the realm of functional programming.  As we are getting into the lower lever details no doubt we will have to start relying on some low level locking primitives like Monitors, Semaphores, and Interlocked operations, even the F# core libraries have a
cornucopia of those.</p>

<p>Lets look at the first member <code>WaitAsync()</code>.  The first step is to create a something to store the result of the operation, all we will just be storing and returning
asynchronously is a boolean to indicate that the wait handle has been set.  To do this we use one of the types from the
<a href="http://fsharppowerpack.codeplex.com/">F# power pack</a> <code>AsyncResultCell&lt;'T&gt;</code>.  I think that such a type should of been exposed from the F# core libraries but it was
omitted for some reason.  There is a type called <code>ResultCell&lt;'T&gt;</code> with much the same functionality in the FSharp.Core.Control namespace but it is marked internal so
it&#8217;s not available for our use.</p>

<p>We declare a <a href="http://msdn.microsoft.com/en-us/library/dd233186.aspx">reference cell</a> of type <code>AsyncResultCell&lt;'T&gt;</code> and then create the <code>WaitAsync()</code> member, all we have
to do is dereference the value of the reference cell with <code>!</code> and call its <code>AsyncResult</code> member, this gives us an <code>Async&lt;bool&gt;</code> which we can easily use in an asynchronous workflow.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="n">asyncManualResetEvent</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">aResCell</span> <span class="o">=</span> <span class="n">ref</span> <span class="o">&lt;|</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">WaitAsync</span><span class="bp">()</span> <span class="o">=</span> <span class="o">(!</span><span class="n">aResCell</span><span class="o">).</span><span class="nc">AsyncResult</span>
</span></code></pre></td></tr></table></div></figure>


<p>The next bit is fairly simple too.  All we need to do is dereference the value of the reference cell, and invoke the <code>RegisterResult</code> member by passing in a value of
 <code>AsyncOk(true)</code>.  The boolean value of true will be used by the type inference system to constrain the value of the <code>Async&lt;_&gt;</code> returned from <code>WaitAsync</code>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Set</span><span class="bp">()</span> <span class="o">=</span> <span class="o">(!</span><span class="n">aResCell</span><span class="o">).</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="nc">AsyncOk</span><span class="o">(</span><span class="bp">true</span><span class="o">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>The last part is the most complex <em>(as usual)</em>.  Here we create a recursive function called <code>swap</code> that will try to exchange the <code>AsyncResultCell&lt;'T&gt;</code> for a new
one.  We dereference the reference cell to <code>currentValue</code>, then we use a CAS (Compare And Swap) operation to compare the <code>aResCell</code> with <code>currentValue</code> and if they
are equal <code>newVal</code> will replace <code>aResCell</code>.  On the next line if the result of the CAS operation means that <code>result</code> and <code>currentValue</code> are equal then we are finished,
otherwise we spin the current thread for 20 cycles using <code>Thread.SpinWait 20</code> before retrying the operation via recursion <code>swap newVal</code>.  This will be a lot less
expensive than switching to user or kernel mode locking, and the period of contention between threads should be very small.  Finally the swap operation is started
by passing in a new <code>AsyncResultCell&lt;'T&gt;</code>.</p>

<p>There are various other methods we could of used, for instance we could of wrapped a <code>ManualResetEvent</code> with a call to <code>Async.AwaitWaitHandle</code>, although this
would of meant using the kernel mode locking of the <code>ManualResetEvent</code> which is a bit more expensive.</p>

<p>In Stephen Toub&#8217;s post he mentions Task&#8217;s being orphaned due to the <code>Reset()</code> method being called before the <code>Task&lt;'T&gt;</code> has been completed, that shouldn&#8217;t happen in our
implementation due the the closures being stored internally for completion by the async infrastructure.  Heres a quick test harness to make sure everything works as expected anyway.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Reset</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">rec</span> <span class="n">swap</span> <span class="n">newVal</span> <span class="o">=</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">currentValue</span> <span class="o">=</span> <span class="o">!</span><span class="n">aResCell</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nn">Interlocked</span><span class="p">.</span><span class="nc">CompareExchange</span><span class="o">&lt;_&gt;(</span><span class="n">aResCell</span><span class="o">,</span> <span class="n">newVal</span><span class="o">,</span> <span class="n">currentValue</span><span class="o">)</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="nc">ReferenceEquals</span><span class="o">(</span><span class="n">result</span><span class="o">,</span> <span class="n">currentValue</span><span class="o">)</span> <span class="k">then</span> <span class="bp">()</span>
</span><span class='line'>            <span class="k">else</span> <span class="nn">Thread</span><span class="p">.</span><span class="nc">SpinWait</span> <span class="mi">20</span>
</span><span class='line'>                 <span class="n">swap</span> <span class="n">newVal</span>
</span><span class='line'>        <span class="n">swap</span> <span class="o">&lt;|</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">amre</span> <span class="o">=</span> <span class="n">asyncManualResetEvent</span><span class="bp">()</span>
</span><span class='line'><span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="n">async</span><span class="o">{</span><span class="k">let</span><span class="o">!</span> <span class="n">x</span> <span class="o">=</span> <span class="n">amre</span><span class="o">.</span><span class="nc">WaitAsync</span><span class="bp">()</span>
</span><span class='line'>              <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span><span class="s2">&quot;First signalled&quot;</span><span class="o">)}</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">y</span> <span class="o">=</span> <span class="n">async</span><span class="o">{</span><span class="k">let</span><span class="o">!</span> <span class="n">x</span> <span class="o">=</span> <span class="n">amre</span><span class="o">.</span><span class="nc">WaitAsync</span><span class="bp">()</span>
</span><span class='line'>             <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span><span class="s2">&quot;Second signalled&quot;</span><span class="o">)}</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">z</span> <span class="o">=</span> <span class="n">async</span><span class="o">{</span><span class="k">let</span><span class="o">!</span> <span class="n">x</span> <span class="o">=</span> <span class="n">amre</span><span class="o">.</span><span class="nc">WaitAsync</span><span class="bp">()</span>
</span><span class='line'>              <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span><span class="s2">&quot;Third signalled&quot;</span><span class="o">)}</span>
</span><span class='line'><span class="c1">//start async workflows x and y</span>
</span><span class='line'><span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span> <span class="n">x</span>
</span><span class='line'><span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span> <span class="n">y</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//reset the asyncManualResetEvent, this will test whether the async workflows x and y </span>
</span><span class='line'><span class="c1">// are orphaned due to the AsyncResultCell being recycled.</span>
</span><span class='line'><span class="n">amre</span><span class="o">.</span><span class="nc">Reset</span><span class="bp">()</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//now start the async z</span>
</span><span class='line'><span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span> <span class="n">z</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//we set a single time, this should result in the three async workflows completing</span>
</span><span class='line'><span class="n">amre</span><span class="o">.</span><span class="nc">Set</span><span class="bp">()</span>
</span><span class='line'>
</span><span class='line'><span class="nn">Console</span><span class="p">.</span><span class="nc">ReadLine</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we can see everything works out as we expected:</p>

<p><img src="https://lh6.googleusercontent.com/-NYIKC5Gaahs/T4YAQGtP9RI/AAAAAAAABR8/_cTOriC1_Fw/amre.png" title="" ></p>

<p>Thats all there is too it, next time I will be exploring an asyncAutoResetEvent in much the same vein.</p>

<hr />

<h4>Musical inspiration during the creation of this post:</h4>

<ul>
<li>Smashing Pumpkins - Zeitgeist</li>
<li>Soulfly - Primitive</li>
<li>FooFighters - FooFighters<br/>
<img src="http://upload.wikimedia.org/wikipedia/en/f/fb/Zeitgeist_cover.png" width="125" title="Smashing Pumpkins Zeitgeist" ><img src="http://upload.wikimedia.org/wikipedia/en/3/34/Primitive.png" width="125" title="Soulfly Primitive" ><img src="http://upload.wikimedia.org/wikipedia/en/0/0d/FooFighters-FooFighters.jpg" width="125" title="FooFighters" ></li>
</ul>


<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Black-Scholes Taste Test]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/03/11/black-scholes-taste-test/"/>
    <updated>2012-03-11T23:58:00+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/03/11/black-scholes-taste-test</id>
    <content type="html"><![CDATA[<p>In this edition we are going to be doing a taste test, C# vs F#.  Oh yeah, if you quickly glanced at the title you may
have thought this was a recipe for black scones, as interesting and tasty as that may be, unfortunately its going
to be finance related.</p>

<p>I recently presented a paper on the benefits of F#, part of this was a comparison of the famous
<a href="http://en.wikipedia.org/wiki/Black-Scholes">Black-Scholes</a> equation in both C# and F#.  I was mainly going to be
looking at code succinctness and the inherent suitability of the language for calculation based work, but there ended
up being more to it than that.</p>

<p>First of all I quickly set up a test rig to run 50 million iterations of the algorithm to see if there were any difference
in the processing speed.  I want expecting any major differences at this point but here&#8217;s what I got:</p>

<p>C# results for 50 million iterations <img src="https://lh6.googleusercontent.com/-cEzGoE_P2cE/T1vf_SxtGfI/AAAAAAAABRE/RE4ReRLAhu8/s531/csbs.png"></p>

<p>F# results for 50 million iterations <img src="https://lh3.googleusercontent.com/-PLdltL0YiIs/T1vf_Wo2ZrI/AAAAAAAABRI/WijGdNaOnK4/s531/fsbs.png"></p>

<p>I think you will agree that&#8217;s quite a difference, lets have a look at the code to see what&#8217;s going on.</p>

<h2>C# Implementation</h2>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Options</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">enum</span> <span class="n">Style</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Call</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Put</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">double</span> <span class="nf">BlackScholes</span><span class="p">(</span><span class="n">Style</span> <span class="n">callPut</span><span class="p">,</span> <span class="kt">double</span> <span class="n">s</span><span class="p">,</span> <span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="kt">double</span> <span class="n">t</span><span class="p">,</span> <span class="kt">double</span> <span class="n">r</span><span class="p">,</span> <span class="kt">double</span> <span class="n">v</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">double</span> <span class="n">result</span> <span class="p">=</span> <span class="m">0.0</span><span class="p">;</span>
</span><span class='line'>        <span class="n">var</span> <span class="n">d1</span> <span class="p">=</span> <span class="p">(</span><span class="n">Math</span><span class="p">.</span><span class="n">Log</span><span class="p">(</span><span class="n">s</span> <span class="p">/</span> <span class="n">x</span><span class="p">)</span> <span class="p">+</span> <span class="p">(</span><span class="n">r</span> <span class="p">+</span> <span class="n">v</span> <span class="p">*</span> <span class="n">v</span> <span class="p">/</span> <span class="m">2.0</span><span class="p">)</span> <span class="p">*</span> <span class="n">t</span><span class="p">)</span> <span class="p">/</span> <span class="p">(</span><span class="n">v</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">Sqrt</span><span class="p">(</span><span class="n">t</span><span class="p">));</span>
</span><span class='line'>        <span class="n">var</span> <span class="n">d2</span> <span class="p">=</span> <span class="n">d1</span> <span class="p">-</span> <span class="n">v</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">Sqrt</span><span class="p">(</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>        <span class="k">switch</span> <span class="p">(</span><span class="n">callPut</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">case</span> <span class="n">Style</span><span class="p">.</span><span class="n">Call</span><span class="p">:</span>
</span><span class='line'>                <span class="n">result</span> <span class="p">=</span> <span class="n">s</span> <span class="p">*</span> <span class="n">Cnd</span><span class="p">(</span><span class="n">d1</span><span class="p">)</span> <span class="p">-</span><span class="n">x</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">Exp</span><span class="p">(-</span><span class="n">r</span> <span class="p">*</span> <span class="n">t</span><span class="p">)</span> <span class="p">*</span> <span class="n">Cnd</span><span class="p">(</span><span class="n">d2</span><span class="p">);</span>
</span><span class='line'>                <span class="k">break</span><span class="p">;</span>
</span><span class='line'>            <span class="k">case</span> <span class="n">Style</span><span class="p">.</span><span class="n">Put</span><span class="p">:</span>
</span><span class='line'>                <span class="n">result</span> <span class="p">=</span> <span class="n">x</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">Exp</span><span class="p">(-</span><span class="n">r</span> <span class="p">*</span> <span class="n">t</span><span class="p">)</span> <span class="p">*</span> <span class="n">Cnd</span><span class="p">(-</span><span class="n">d2</span><span class="p">)</span> <span class="p">-</span><span class="n">s</span> <span class="p">*</span> <span class="n">Cnd</span><span class="p">(-</span><span class="n">d1</span><span class="p">);</span>
</span><span class='line'>                <span class="k">break</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">private</span> <span class="k">static</span> <span class="kt">double</span> <span class="nf">Cnd</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">double</span> <span class="n">a1</span> <span class="p">=</span> <span class="m">0.31938153</span><span class="p">;</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">double</span> <span class="n">a2</span> <span class="p">=</span> <span class="p">-</span><span class="m">0.356563782</span><span class="p">;</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">double</span> <span class="n">a3</span> <span class="p">=</span> <span class="m">1.781477937</span><span class="p">;</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">double</span> <span class="n">a4</span> <span class="p">=</span> <span class="p">-</span><span class="m">1.821255978</span><span class="p">;</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">double</span> <span class="n">a5</span> <span class="p">=</span> <span class="m">1.330274429</span><span class="p">;</span>
</span><span class='line'>        <span class="n">var</span> <span class="n">l</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="n">Abs</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span><span class='line'>        <span class="n">var</span> <span class="n">k</span> <span class="p">=</span> <span class="m">1.0</span> <span class="p">/</span> <span class="p">(</span><span class="m">1.0</span> <span class="p">+</span> <span class="m">0.2316419</span> <span class="p">*</span> <span class="n">l</span><span class="p">);</span>
</span><span class='line'>        <span class="n">var</span> <span class="n">w</span> <span class="p">=</span> <span class="m">1.0</span> <span class="p">-</span> <span class="m">1.0</span> <span class="p">/</span> <span class="n">Math</span><span class="p">.</span><span class="n">Sqrt</span><span class="p">(</span><span class="m">2</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">PI</span><span class="p">)</span> <span class="p">*</span>
</span><span class='line'>            <span class="n">Math</span><span class="p">.</span><span class="n">Exp</span><span class="p">(-</span><span class="n">l</span> <span class="p">*</span> <span class="n">l</span> <span class="p">/</span> <span class="m">2.0</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">a1</span> <span class="p">*</span> <span class="n">k</span> <span class="p">+</span> <span class="n">a2</span> <span class="p">*</span> <span class="n">k</span> <span class="p">*</span> <span class="n">k</span> <span class="p">+</span> <span class="n">a3</span> <span class="p">*</span>
</span><span class='line'>                <span class="n">Math</span><span class="p">.</span><span class="n">Pow</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="m">3</span><span class="p">)</span> <span class="p">+</span> <span class="n">a4</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">Pow</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="m">4</span><span class="p">)</span> <span class="p">+</span> <span class="n">a5</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">Pow</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="m">5</span><span class="p">));</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="p">&lt;</span> <span class="m">0</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="m">1.0</span> <span class="p">-</span> <span class="n">w</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">w</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>F# Implementation</h2>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="n">options</span>
</span><span class='line'><span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>
</span><span class='line'><span class="k">type</span> <span class="nc">Style</span> <span class="o">=</span> <span class="nc">Call</span> <span class="o">|</span> <span class="nc">Put</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">cnd</span> <span class="n">x</span> <span class="o">=</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">a1</span> <span class="o">=</span> <span class="mi">0</span><span class="o">.</span><span class="mi">31938153</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">a2</span> <span class="o">=</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">356563782</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">a3</span> <span class="o">=</span> <span class="mi">1</span><span class="o">.</span><span class="mi">781477937</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">a4</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">.</span><span class="mi">821255978</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">a5</span> <span class="o">=</span> <span class="mi">1</span><span class="o">.</span><span class="mi">330274429</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">l</span>  <span class="o">=</span> <span class="n">abs</span> <span class="n">x</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">k</span>  <span class="o">=</span> <span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">/</span> <span class="o">(</span><span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">+</span> <span class="mi">0</span><span class="o">.</span><span class="mi">2316419</span> <span class="o">*</span> <span class="n">l</span><span class="o">)</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">w</span>  <span class="o">=</span> <span class="o">(</span><span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">-</span> <span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">/</span> <span class="n">sqrt</span><span class="o">(</span><span class="mi">2</span><span class="o">.</span><span class="mi">0</span> <span class="o">*</span> <span class="nn">Math</span><span class="p">.</span><span class="nc">PI</span><span class="o">)</span> <span class="o">*</span>
</span><span class='line'>                <span class="n">exp</span><span class="o">(-</span><span class="n">l</span> <span class="o">*</span> <span class="n">l</span> <span class="o">/</span> <span class="mi">2</span><span class="o">.</span><span class="mi">0</span><span class="o">)</span> <span class="o">*</span> <span class="o">(</span><span class="n">a1</span> <span class="o">*</span> <span class="n">k</span> <span class="o">+</span> <span class="n">a2</span> <span class="o">*</span> <span class="n">k</span> <span class="o">*</span> <span class="n">k</span> <span class="o">+</span> <span class="n">a3</span> <span class="o">*</span>
</span><span class='line'>                    <span class="o">(</span><span class="n">pown</span> <span class="n">k</span> <span class="mi">3</span><span class="o">)</span> <span class="o">+</span> <span class="n">a4</span> <span class="o">*</span> <span class="o">(</span><span class="n">pown</span> <span class="n">k</span> <span class="mi">4</span><span class="o">)</span> <span class="o">+</span> <span class="n">a5</span> <span class="o">*</span> <span class="o">(</span><span class="n">pown</span> <span class="n">k</span> <span class="mi">5</span><span class="o">)))</span>
</span><span class='line'>   <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="o">.</span><span class="mi">0</span> <span class="k">then</span> <span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">-</span> <span class="n">w</span>
</span><span class='line'>   <span class="k">else</span> <span class="n">w</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">blackscholes</span> <span class="n">style</span> <span class="n">s</span> <span class="n">x</span> <span class="n">t</span> <span class="n">r</span> <span class="n">v</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">d1</span> <span class="o">=</span> <span class="o">(</span><span class="n">log</span><span class="o">(</span><span class="n">s</span> <span class="o">/</span> <span class="n">x</span><span class="o">)</span> <span class="o">+</span> <span class="o">(</span><span class="n">r</span> <span class="o">+</span> <span class="n">v</span> <span class="o">*</span> <span class="n">v</span> <span class="o">/</span> <span class="mi">2</span><span class="o">.</span><span class="mi">0</span><span class="o">)</span> <span class="o">*</span> <span class="n">t</span><span class="o">)</span> <span class="o">/</span> <span class="o">(</span><span class="n">v</span> <span class="o">*</span> <span class="n">sqrt</span><span class="o">(</span><span class="n">t</span><span class="o">))</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">d2</span> <span class="o">=</span> <span class="n">d1</span> <span class="o">-</span> <span class="n">v</span> <span class="o">*</span> <span class="n">sqrt</span><span class="o">(</span><span class="n">t</span><span class="o">)</span>
</span><span class='line'>    <span class="k">match</span> <span class="n">style</span> <span class="k">with</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">Call</span> <span class="o">-&gt;</span> <span class="n">s</span> <span class="o">*</span> <span class="n">cnd</span><span class="o">(</span><span class="n">d1</span><span class="o">)</span> <span class="o">-</span><span class="n">x</span> <span class="o">*</span> <span class="n">exp</span><span class="o">(-</span><span class="n">r</span> <span class="o">*</span> <span class="n">t</span><span class="o">)</span> <span class="o">*</span> <span class="n">cnd</span><span class="o">(</span><span class="n">d2</span><span class="o">)</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">Put</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="o">*</span> <span class="n">exp</span><span class="o">(-</span><span class="n">r</span> <span class="o">*</span> <span class="n">t</span><span class="o">)</span> <span class="o">*</span> <span class="n">cnd</span><span class="o">(-</span><span class="n">d2</span><span class="o">)</span> <span class="o">-</span><span class="n">s</span> <span class="o">*</span> <span class="n">cnd</span><span class="o">(-</span><span class="n">d1</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Differences</h2>

<p>The most significant differences when the code is compiled comes down to a few areas.</p>

<h3>The BlackScholes function</h3>

<p>The first thing to note is the code size and number of local variables:</p>

<figure class='code'><figcaption><span>F# </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>// Code size       122 (0x7a)
</span><span class='line'>.maxstack  6
</span><span class='line'>.locals init ([0] float64 d1,
</span><span class='line'>         [1] float64 d2)</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>C# </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>// Code size       164 (0xa4)
</span><span class='line'>.maxstack  4
</span><span class='line'>.locals init ([0] float64 d1,
</span><span class='line'>         [1] float64 d2,
</span><span class='line'>         [2] float64 result,
</span><span class='line'>         [3] valuetype CsBs.Options/Style CS$0$0000)</span></code></pre></td></tr></table></div></figure>


<p>The initial arguments that are loaded in the F# implementation is done in fewer IL op codes then C#.</p>

<figure class='code'><figcaption><span>F# </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0001:  ldarg.1
</span><span class='line'>IL_0002:  ldarg.2
</span><span class='line'>IL_0003:  div
</span><span class='line'>IL_0004:  call       float64 [mscorlib]System.Math::Log(float64)</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>C#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0000:  ldc.r8     0.0
</span><span class='line'>IL_0009:  stloc.0
</span><span class='line'>IL_000a:  ldc.r8     0.0
</span><span class='line'>IL_0013:  stloc.1
</span><span class='line'>IL_0014:  ldc.r8     0.0
</span><span class='line'>IL_001d:  stloc.2
</span><span class='line'>IL_001e:  ldarg.1
</span><span class='line'>IL_001f:  ldarg.2
</span><span class='line'>IL_0020:  div
</span><span class='line'>IL_0021:  call       float64 [mscorlib]System.Math::Log(float64)</span></code></pre></td></tr></table></div></figure>


<p>You can see in the C# code is intialising the local variable to 0.0 by pushing them to the stack
<code>ldc.r8</code> then storing them <code>stloc.0</code>.</p>

<p>The pattern matching in the F# code results in a call to get the style <code>options/Style::get_Tag()</code>
and then a branch if not equal opcode <code>bne.un.s</code> which causes a jump to <code>IL_005d</code></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0036:  call       instance int32 options/Style::get_Tag()```
</span><span class='line'>IL_003b:  ldc.i4.1
</span><span class='line'>IL_003c:  bne.un.s   IL_005d</span></code></pre></td></tr></table></div></figure>


<p>The C# version loads the local variable for the <code>Style</code> <code>IL_0053:  stloc.3</code> and then uses the switch
opcode to jump table to jump to either position <code>IL_0064</code> or <code>IL_0083</code>.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0053:  stloc.3
</span><span class='line'>IL_0054:  ldloc.3
</span><span class='line'>IL_0055:  switch     ( 
</span><span class='line'>                      IL_0064,
</span><span class='line'>                      IL_0083)
</span><span class='line'>IL_0062:  br.s       IL_00a2</span></code></pre></td></tr></table></div></figure>


<p>These are negligible, I&#8217;m mealy pointing out the differences in compilation between the two languages.<br/>
The F# compiler is more stringent when compiling the code.</p>

<h3>The Cnd function</h3>

<p>The Cnd function or <a href="http://en.wikipedia.org/wiki/Normal_distribution">cumulative normal distribution</a>
is where the performance differences occur.</p>

<p>Again at initialization you can see the C# version is larger by 41.</p>

<figure class='code'><figcaption><span>F# </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>// Code size       213 (0xd5)
</span><span class='line'>.maxstack  8
</span><span class='line'>.locals init ([0] float64 l,
</span><span class='line'>         [1] float64 k,
</span><span class='line'>         [2] float64 w)</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>C#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>// Code size       254 (0xfe)
</span><span class='line'>.maxstack  6
</span><span class='line'>.locals init ([0] float64 l,
</span><span class='line'>         [1] float64 k,
</span><span class='line'>         [2] float64 w)</span></code></pre></td></tr></table></div></figure>


<p>The C# version initialises all the local variables to 0.0.</p>

<figure class='code'><figcaption><span>C#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0000:  ldc.r8     0.0
</span><span class='line'>IL_0009:  stloc.0
</span><span class='line'>IL_000a:  ldc.r8     0.0
</span><span class='line'>IL_0013:  stloc.1
</span><span class='line'>IL_0014:  ldc.r8     0.0
</span><span class='line'>IL_001d:  stloc.2</span></code></pre></td></tr></table></div></figure>


<p>Interestingly the C# compiler optimises out the call to <code>Math.PI * 2</code> but the F# compiler doesn&#8217;t.</p>

<figure class='code'><figcaption><span>F#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_003a:  ldc.r8     2.
</span><span class='line'>IL_0043:  ldc.r8     3.1415926535897931
</span><span class='line'>IL_004c:  mul</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>C#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0057:  ldc.r8     6.2831853071795862</span></code></pre></td></tr></table></div></figure>


<p>From here everything is identical until we get to the power operator section (<code>Math.Pow</code> in the C# version and <code>pown</code> in F#).</p>

<figure class='code'><figcaption><span>F#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_0089:  ldloc.1
</span><span class='line'>IL_008a:  ldc.i4.3
</span><span class='line'>IL_008b:  call       float64 [FSharp.Core]Microsoft.FSharp.Core.Operators/OperatorIntrinsics::PowDouble(float64, 
</span><span class='line'>                                                                                                        int32)</span></code></pre></td></tr></table></div></figure>


<p>In the F# code we are using the <code>pown</code> function which calculates the power to an integer.  This is shown in the
call to <code>OperatorIntrinsics::PowDouble</code> which uses the value in <code>IL_0089:  ldloc.1</code> and also loads the
integer 3 with <code>IL_008a:  ldc.i4.3</code>.</p>

<figure class='code'><figcaption><span>C#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_009c:  ldloc.1
</span><span class='line'>IL_009d:  ldc.r8     3.
</span><span class='line'>IL_00a6:  call       float64 [mscorlib]System.Math::Pow(float64,
</span><span class='line'>                                                        float64)</span></code></pre></td></tr></table></div></figure>


<p>The C# code is using the standard Math.Pow operator which operates on two float64 numbers.  The value of 3 is
implicitly converted into a <code>float64</code> during compilation <code>IL_009d:  ldc.r8     3.</code>.</p>

<p>The final difference is at the end of the function.</p>

<figure class='code'><figcaption><span>F#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_00b8:  stloc.2
</span><span class='line'>IL_00b9:  ldarg.0
</span><span class='line'>IL_00ba:  ldc.r8     0.0
</span><span class='line'>IL_00c3:  clt
</span><span class='line'>IL_00c5:  brfalse.s  IL_00d3
</span><span class='line'>IL_00c7:  ldc.r8     1.
</span><span class='line'>IL_00d0:  ldloc.2
</span><span class='line'>IL_00d1:  sub
</span><span class='line'>IL_00d2:  ret
</span><span class='line'>IL_00d3:  ldloc.2
</span><span class='line'>IL_00d4:  ret</span></code></pre></td></tr></table></div></figure>


<p>The F# version uses the <code>clt</code> opcode.  This pushes 1 if value one on the stack is less than value two otherwise
it pushes 0.  There is then a <code>brfalse.s</code> which jumps to location <code>IL_00d3</code> if the first value on the stack is
less than or equal to the second value.</p>

<figure class='code'><figcaption><span>C#  </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>IL_00b8:  stloc.2
</span><span class='line'>IL_00b9:  ldarg.0
</span><span class='line'>IL_00e5:  ldc.r8     0.0
</span><span class='line'>IL_00ee:  bge.un.s   IL_00fc
</span><span class='line'>IL_00f0:  ldc.r8     1.
</span><span class='line'>IL_00f9:  ldloc.2
</span><span class='line'>IL_00fa:  sub
</span><span class='line'>IL_00fb:  ret
</span><span class='line'>IL_00fc:  ldloc.2
</span><span class='line'>IL_00fd:  ret</span></code></pre></td></tr></table></div></figure>


<p>The C# version uses the <code>bge.un.s</code> to jump to location <code>IL_00fc</code> if the first value on the stack is greater than
the second.  This is negligible in normal runtime but it is interesting to note the difference between the two.</p>

<h2>Conclusion</h2>

<p>Wow, there was a lot of IL to get through, I hope you stayed with me!</p>

<p>Although the difference in some areas are negligible, every little counts.  The implicit conversion of an integer
field to a <code>float64</code> hides the fact that we were using an optimized integer power function in F#, that&#8217;s performance
increase of 168%!  Some other side effects of implicit conversion can also lead to subtle bugs due to truncation
and overflow.  The other benefits are the compiled code uses less instructions and the source code only uses 25
lines compared to 44 in C#.</p>

<p>Until next time!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[FSharp Dataflow agents III]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/02/20/fsharp-dataflow-agents-iii/"/>
    <updated>2012-02-20T07:30:00+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/02/20/fsharp-dataflow-agents-iii</id>
    <content type="html"><![CDATA[<p>This will be the last post on rebuilding the <code>MailboxProcessor</code> using <a href="http://msdn.microsoft.com/en-us/devlabs/gg585582">TDF</a>,
here&#8217;s a quick discussion of the missing pieces&#8230;</p>

<p>First, lets start with the simple ones, these don&#8217;t really require much discussion.</p>

<h3>DefaultTimeout</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="k">mutable</span> <span class="n">defaultTimeout</span> <span class="o">=</span> <span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span>
</span><span class='line'>
</span><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">DefaultTimeout</span>
</span><span class='line'>   <span class="k">with</span> <span class="n">get</span><span class="bp">()</span> <span class="o">=</span> <span class="n">defaultTimeout</span>
</span><span class='line'>   <span class="k">and</span> <span class="n">set</span><span class="o">(</span><span class="n">value</span><span class="o">)</span> <span class="o">=</span> <span class="n">defaultTimeout</span> <span class="o">&lt;-</span> <span class="n">value</span>
</span></code></pre></td></tr></table></div></figure>


<p>This simply provides a mutable property using <code>Timeout.Infinite</code> as a default setting.</p>

<h3>CurrentQueueLength</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">CurrentQueueLength</span><span class="bp">()</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Count</span>
</span></code></pre></td></tr></table></div></figure>


<p>Another simple one, this methods uses into the underlying <code>BufferBlock</code> to extract its current queue length using its <code>Count</code> property.</p>

<h3>TryReceive</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">TryReceive</span><span class="o">(?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">ts</span> <span class="o">=</span> <span class="nn">TimeSpan</span><span class="p">.</span><span class="nc">FromMilliseconds</span><span class="o">(</span><span class="kt">float</span> <span class="o">&lt;|</span> <span class="n">defaultArg</span> <span class="n">time</span> <span class="n">out</span> <span class="n">defaultTimeout</span><span class="o">)</span>
</span><span class='line'>    <span class="nn">Async</span><span class="p">.</span><span class="nc">AwaitTask</span> <span class="o">&lt;|</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">ReceiveAsync</span><span class="o">(</span><span class="n">ts</span><span class="o">)</span>
</span><span class='line'>                           <span class="o">.</span><span class="nc">ContinueWith</span><span class="o">(</span><span class="k">fun</span> <span class="o">(</span><span class="n">tt</span><span class="o">:</span><span class="nc">Task</span><span class="o">&lt;_&gt;)</span> <span class="o">-&gt;</span>
</span><span class='line'>                                             <span class="k">if</span> <span class="n">tt</span><span class="o">.</span><span class="nc">IsCanceled</span> <span class="o">||</span> <span class="n">tt</span><span class="o">.</span><span class="nc">IsFaulted</span> <span class="k">then</span> <span class="nc">None</span>
</span><span class='line'>                                             <span class="k">else</span> <span class="nc">Some</span> <span class="n">tt</span><span class="o">.</span><span class="nc">Result</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we get a little help from <a href="http://msdn.microsoft.com/en-us/library/dd460717.aspx">TPL</a> to apply a continuation on completion
using <code>ContinueWith</code>.  We use a lambda to return either <code>None</code>, in a time out condition, or <code>Some tt.Result</code> when we successfully receive an item.</p>

<h3>TryPostAndReply</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>    <span class="o">...</span>
</span><span class='line'>  <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">TryWaitResultSynchronously</span><span class="o">(</span><span class="n">timeout</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="c1">//early completion check</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">IsCompleted</span> <span class="k">then</span>
</span><span class='line'>          <span class="nc">Some</span> <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">Result</span>
</span><span class='line'>      <span class="c1">//now force a wait for the task to complete</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>          <span class="k">if</span> <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">Wait</span><span class="o">(</span><span class="n">timeout</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>              <span class="nc">Some</span> <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">Result</span>
</span><span class='line'>          <span class="k">else</span> <span class="nc">None</span>
</span><span class='line'>
</span><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">TryPostAndReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">:</span><span class="k">&#39;</span><span class="nc">Reply</span> <span class="n">option</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="n">timeout</span> <span class="n">defaultTimeout</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">resultCell</span> <span class="o">=</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">replyChannelMsg</span><span class="o">(</span><span class="k">new</span> <span class="nc">AsyncReplyChannel</span><span class="o">&lt;_&gt;(</span><span class="k">fun</span> <span class="n">reply</span> <span class="o">-&gt;</span> <span class="n">resultCell</span><span class="o">.</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="n">reply</span><span class="o">)))</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">msg</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>        <span class="n">resultCell</span><span class="o">.</span><span class="nc">TryWaitResultSynchronously</span><span class="o">(</span><span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>    <span class="k">else</span> <span class="nc">None</span>
</span></code></pre></td></tr></table></div></figure>


<p>Things get a little more interesting from here on in.  Firstly we need to add a new synchronisation member to the <code>AsyncResultCell&lt;'a&gt;</code> type: <code>TryWaitResultSynchronously</code>.   We again enlist the help of the TPL primitives to check for the early completion using <code>source.Task.IsCompleted</code> returning the result if it is there, otherwise we use the <code>Task</code> property&#8217;s <code>Wait</code> method to check the item returns within the time out interval.  In the usual manner, <code>Some source.Task.Result</code> is returned or <code>None</code> for a failure.</p>

<h3>PostAndReply</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">PostAndReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">:</span> <span class="k">&#39;</span><span class="nc">Reply</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">match</span> <span class="n">x</span><span class="o">.</span><span class="nc">TryPostAndReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">)</span> <span class="k">with</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span>  <span class="n">raise</span> <span class="o">(</span><span class="nc">TimeoutException</span><span class="o">(</span><span class="s2">&quot;PostAndReply timed out&quot;</span><span class="o">))</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">Some</span> <span class="n">result</span> <span class="o">-&gt;</span> <span class="n">result</span>
</span></code></pre></td></tr></table></div></figure>


<p>This one wraps a call to <code>TryPostAndReply</code> with some pattern matching.  In the event of a time out <code>None</code> is returned from <code>TryPostAndReply</code> in this instance we raise a <code>TimeoutException</code> otherwise we unwrap the result from the option using <code>| Some result -&gt; result</code>.</p>

<h3>TryScan</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">TryScan</span><span class="o">((</span><span class="n">scanner</span><span class="o">:</span> <span class="k">&#39;</span><span class="nc">Msg</span> <span class="o">-&gt;</span> <span class="nc">Async</span><span class="o">&lt;_&gt;</span> <span class="n">option</span><span class="o">),</span> <span class="n">timeout</span><span class="o">):</span> <span class="nc">Async</span><span class="o">&lt;_</span> <span class="n">option</span><span class="o">&gt;</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">ts</span> <span class="o">=</span> <span class="nn">TimeSpan</span><span class="p">.</span><span class="nc">FromMilliseconds</span><span class="o">(</span> <span class="kt">float</span> <span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">rec</span> <span class="n">loopForMsg</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">let</span><span class="o">!</span> <span class="n">msg</span> <span class="o">=</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">AwaitTask</span> <span class="o">&lt;|</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">ReceiveAsync</span><span class="o">(</span><span class="n">ts</span><span class="o">)</span>
</span><span class='line'>                                      <span class="o">.</span><span class="nc">ContinueWith</span><span class="o">(</span><span class="k">fun</span> <span class="o">(</span><span class="n">tt</span><span class="o">:</span><span class="nc">Task</span><span class="o">&lt;_&gt;)</span> <span class="o">-&gt;</span>
</span><span class='line'>                                          <span class="k">if</span> <span class="n">tt</span><span class="o">.</span><span class="nc">IsCanceled</span> <span class="o">||</span> <span class="n">tt</span><span class="o">.</span><span class="nc">IsFaulted</span> <span class="k">then</span> <span class="nc">None</span>
</span><span class='line'>                                          <span class="k">else</span> <span class="nc">Some</span> <span class="n">tt</span><span class="o">.</span><span class="nc">Result</span><span class="o">)</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">msg</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span> <span class="nc">Some</span> <span class="n">m</span> <span class="o">-&gt;</span>  <span class="k">let</span> <span class="n">res</span> <span class="o">=</span> <span class="n">scanner</span> <span class="n">m</span>
</span><span class='line'>                     <span class="k">match</span> <span class="n">res</span> <span class="k">with</span>
</span><span class='line'>                     <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">loopForMsg</span>
</span><span class='line'>                     <span class="o">|</span> <span class="nc">Some</span> <span class="n">res</span> <span class="o">-&gt;</span> <span class="k">return</span><span class="o">!</span> <span class="n">res</span>
</span><span class='line'>        <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span> <span class="k">return</span> <span class="nc">None</span><span class="o">}</span>
</span><span class='line'>    <span class="n">loopForMsg</span>
</span></code></pre></td></tr></table></div></figure>


<p>This one also uses the same <code>ContinueWith</code> functionality in the recursive <code>loopForMsg</code> function, perhaps some
of these functions could extracted out and refactored but I prefer to keep the code like this to better explain what&#8217;s going
on.  The the code is available on GitHub anyway so feel free to clean up any detritus and send me a pull request.  Again we use pattern matching to keep calling the <code>loopForMsg</code> function until the result is returned or a time out occurs.</p>

<h3>Scan</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Scan</span><span class="o">(</span><span class="n">scanner</span><span class="o">,</span> <span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">res</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="nc">TryScan</span><span class="o">(</span><span class="n">scanner</span><span class="o">,</span> <span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">res</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span> <span class="k">return</span> <span class="n">raise</span><span class="o">(</span><span class="nc">TimeoutException</span><span class="o">(</span><span class="s2">&quot;Scan TimedOut&quot;</span><span class="o">))</span>
</span><span class='line'>            <span class="o">|</span> <span class="nc">Some</span> <span class="n">res</span> <span class="o">-&gt;</span> <span class="k">return</span> <span class="n">res</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally we have Scan, this is much like PostAndReply in that it just acts as a wrapper around <code>TryScan</code> making use of
pattern matching throwing an exception on a time out.</p>

<p>That sums up the last few pieces, completing the TDF implementation of the <code>MailboxProcessor</code>.  I think this series of posts has shown the elegance of F#&#8217;s asynchronous workflows.  The use of recursive functions and the compositional nature of asynchronous workflows really helps when you are doing this type of programming.  It&#8217;s also very nice on the eye, each section being clearly defined.</p>

<p>The more astute of you may have noticed something a little different.  <code>Scan</code> and <code>TryScan</code> are destructive in this implementation, the unmatched messages are purged from the internal queue.  Although I could have mirrored the same functionality of the <code>MailboxProcessor</code> by using an internal list to keep track of unmatched messages, this leads to performing checks during <code>Receive</code> and <code>Scan</code> and their derivatives to make sure that this list is used first when switching from <code>Scan</code> and <code>Receive</code> functionality.</p>

<p>I think the separation of concerns are a little fuzzy in the <code>MailboxProcessor</code>.  The <code>scan</code> function seems like an after thought, even if you don&#8217;t use <code>Scan</code> you still pay a price for it as there are numerous checks between the internal queue and the unmatched messages list.  You can also run into issues while using <code>Scan</code> and <code>TryScan</code> that can result in out of memory conditions due to the inherent unbounded nature.  I will briefly describe and explore the conditions that can lead to that in the next post.  In the implementation presented here we can get bounded checking by passing in an optional <code>DataflowBlockOptions</code> and setting a value for the <code>BoundedCapacity</code> property.</p>

<p><strong>EDIT:</strong> The code for this series of articles is now available on GitHub: <a href="https://github.com/7sharp9/FSharpDataflow">FSharpDataflow</a></p>

<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[F# Dataflow Agents Part II]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/01/30/FSharp-Dataflow-agents-II/"/>
    <updated>2012-01-30T07:49:00+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/01/30/FSharp-Dataflow-agents-II</id>
    <content type="html"><![CDATA[<p>Right, no messing about this time, straight to the code.</p>

<h2>Construction</h2>

<p>This is pretty straight forward and I don&#8217;t want to detract from the important bits of this post, the only thing
of note is the <code>cancellationToken</code> which is initialized to a default value using the <code>defaultArg</code> function if the
optional parameter  <code>cancellationToken</code> is not supplied. The TDF construct that we to use to perform most of the hard
work is <code>incomingMessages</code> which is a <code>BufferBlock&lt;'Msg&gt;</code>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">DataflowAgent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Msg</span><span class="o">&gt;(</span><span class="n">initial</span><span class="o">,</span> <span class="o">?</span><span class="n">cancellationToken</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">cancellationToken</span> <span class="o">=</span>
</span><span class='line'>        <span class="n">defaultArg</span> <span class="n">cancellationToken</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">DefaultCancellationToken</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">mutable</span> <span class="n">started</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">errorEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Event</span><span class="o">&lt;</span><span class="nn">System</span><span class="p">.</span><span class="nc">Exception</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">incomingMessages</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BufferBlock</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Msg</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">mutable</span> <span class="n">defaultTimeout</span> <span class="o">=</span> <span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Error</h2>

<p>This is the public facing part for the Error event.  The <code>[&lt;CLIEvent&gt;]</code> attribute exposes the event in a friendly manner to other .Net languages by adding the <code>add_Error</code> and <code>remove_Error</code> event handler properties to allow subscription to take place.  The <code>Error</code> event fires when an exception is thrown in the <code>initial</code> asynchronous workflow.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="o">[&lt;</span><span class="nc">CLIEvent</span><span class="o">&gt;]</span>
</span><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Error</span> <span class="o">=</span> <span class="n">errorEvent</span><span class="o">.</span><span class="nc">Publish</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Start</h2>

<p>This is implemented the same as the MailboxProcessor.  An exception is thrown if the agent has already started as this is not valid operation.  We set the mutable field <code>started</code> to true and proceed to start the <code>initial</code> asynchronous workflow.  This workflow is wrapped in a <code>try with block</code> so that if an exception is thrown we catch it and trigger the <code>Error</code> event.  The computation is then started with <code>Async.Start(...)</code>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">started</span>
</span><span class='line'>        <span class="k">then</span> <span class="n">raise</span> <span class="o">(</span><span class="k">new</span> <span class="nc">InvalidOperationException</span><span class="o">(</span><span class="s2">&quot;Already Started.&quot;</span><span class="o">))</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>        <span class="n">started</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">comp</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span> <span class="k">try</span> <span class="k">do</span><span class="o">!</span> <span class="n">initial</span> <span class="n">this</span>
</span><span class='line'>                           <span class="k">with</span> <span class="n">error</span> <span class="o">-&gt;</span> <span class="n">errorEvent</span><span class="o">.</span><span class="nc">Trigger</span> <span class="n">error</span> <span class="o">}</span>
</span><span class='line'>        <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span><span class="o">(</span><span class="n">computation</span> <span class="o">=</span> <span class="n">comp</span><span class="o">,</span> <span class="n">cancellationToken</span> <span class="o">=</span> <span class="n">cancellationToken</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Receive</h2>

<p>The Receive member is used by the agent as a way of waiting for a message to arrive without blocking.  Because the TDF functionality is all TPL Task based we use the the <a href="http://msdn.microsoft.com/en-us/library/ee370232.aspx">Async</a> helper functions.  In this instance we utilise the Async.AwaitTask passing in the <code>incomingMessages</code> <code>ReceiveAsync</code> method to wait for
a message to arrive.  The integration between F# async and TDF is nice and succinct here.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Receive</span><span class="o">(?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="nn">Async</span><span class="p">.</span><span class="nc">AwaitTask</span> <span class="o">&lt;|</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">ReceiveAsync</span><span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Post</h2>

<p>The Post member allows a message to be sent to the agents, this member simply calls the <code>incomingMessages</code> <code>Post</code> method passing in the <code>item</code>.  We raise an exception if there is a problem posting (i.e. the <code>incomingMessages</code> internal queue is full).</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">item</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">posted</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">item</span><span class="o">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="ow">not</span> <span class="n">posted</span> <span class="k">then</span>
</span><span class='line'>        <span class="n">raise</span> <span class="o">(</span><span class="nc">InvalidOperationException</span><span class="o">(</span><span class="s2">&quot;Incoming message buffer full.&quot;</span><span class="o">))</span>
</span></code></pre></td></tr></table></div></figure>


<h2>PostAndTryAsyncReply / PostAndAsyncReply</h2>

<p>I&#8217;m grouping both of these together as they are related in functionality.  In the previous post I purposely left
out some ancillary code as it added unnecessary complexity to the introduction.  There are a two types we need to be able to replicate the <code>PostAndTryAsyncReply</code> and <code>PostAndAsyncReply</code> members of the <code>MailboxProcessor</code>.</p>

<h3>AsyncReplyChannel</h3>

<p>The first type we need is the <code>AsyncReplyChannel&lt;'Reply&gt;</code>.  This type takes a function that accepts a generic <code>'Reply</code> and returns a unit.  It is used as a way of communicating back to the caller of the <code>PostAndTryAsyncReply</code> and <code>PostAndAsyncReply</code> members via its single member <code>Reply</code>.  This should become a little clearer when we see it used in context.</p>

<p>An <code>AsyncRepyChannel</code> does actually exist in F# under the Microsoft.FSharp.Control namespace and is used my the <code>MailboxPRocessor</code>, unfortunately its constructor is marked as internal so we are not able to reuse it here.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">AsyncReplyChannel</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Reply</span><span class="o">&gt;(</span><span class="n">replyf</span> <span class="o">:</span> <span class="k">&#39;</span><span class="nc">Reply</span> <span class="o">-&gt;</span> <span class="kt">unit</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="n">reply</span><span class="o">)</span> <span class="o">=</span> <span class="n">replyf</span><span class="o">(</span><span class="n">reply</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>AsyncResultCell</h3>

<p>The next type we need is the <code>AsyncResultCell&lt;'a&gt;</code>.  We use this as a way to await for the results of an asynchronous operation.  We create a <a href="http://msdn.microsoft.com/en-us/library/dd449174.aspx">TaskCompletionSource</a> (<code>source</code>), which is a TPL type that we use as a way of signalling to a callback / lambda expression when a message has arrived.</p>

<p><strong>RegisterResult</strong> is used as a way of notifying when a message has been arrived, this is used internally by our agent as a result of a reply being made to the AsyncReplyChannel.</p>

<p><strong>AsyncWaitResult</strong> is a continuation wrapper, it is called when we want to wait indefinitely for the result to be returned.  It wraps a successful completion with a call to task.Result which then returns the result.</p>

<p><strong>GetWaitHandle</strong> is used as a mechanism to force the asynchronous result to return within a specified timeout interval.  If a result is not returned within the timeout then this function will return false.</p>

<p><strong>GrabResult</strong> returns the result from the TaskCompletionSource object <code>source</code>.  This is set earlier by the <code>RegisterResult</code> member.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">source</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">TaskCompletionSource</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">RegisterResult</span> <span class="n">result</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="nc">SetResult</span><span class="o">(</span><span class="n">result</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">AsyncWaitResult</span> <span class="o">=</span>
</span><span class='line'>        <span class="nn">Async</span><span class="p">.</span><span class="nc">FromContinuations</span><span class="o">(</span><span class="k">fun</span> <span class="o">(</span><span class="n">cont</span><span class="o">,_,_)</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">apply</span> <span class="o">=</span> <span class="k">fun</span> <span class="o">(</span><span class="n">task</span><span class="o">:</span><span class="nc">Task</span><span class="o">&lt;_&gt;)</span> <span class="o">-&gt;</span> <span class="n">cont</span> <span class="o">(</span><span class="n">task</span><span class="o">.</span><span class="nc">Result</span><span class="o">)</span>
</span><span class='line'>            <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">ContinueWith</span><span class="o">(</span><span class="n">apply</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">ignore</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">GetWaitHandle</span><span class="o">(</span><span class="n">timeout</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="n">async</span> <span class="o">{</span> <span class="k">let</span> <span class="n">waithandle</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">Wait</span><span class="o">(</span><span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>                <span class="k">return</span> <span class="n">waithandle</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">x</span><span class="o">.</span><span class="nc">GrabResult</span><span class="bp">()</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="nn">Task</span><span class="p">.</span><span class="nc">Result</span>
</span></code></pre></td></tr></table></div></figure>


<h4>PostAndTryAsyncReply</h4>

<p>This one is a little more tricky and I have added a few line number references to try and make it easier.  On <strong>line 3</strong> we
declare an resultCell to collect the result of the asynchronous operation.  This is used on <strong>line 4</strong> when we create a <code>msg</code>
to post to <code>incomingMessages</code> on <strong>line 5</strong>.  The <code>replyChannelMsg</code> is a function that takes an <code>AsyncReplyChannel</code> and returns
a message, so we create an <code>AsyncReplyChannel</code> with a lambda expression that registers the reply with the <code>resultCell</code>.  This
is the key to how this works, you have to remember that will be done the other side of the operation which will be within the
asynchronous processing loop of the agent when <code>Reply</code> is called on the <code>AsyncReplyChannel</code>.</p>

<p>Finally pattern matching is used on <strong>line 7</strong> to call either <code>AsyncWaitResult</code> or <code>GetWaitHandle</code> on the <code>resultCell</code>.  The <code>AsyncWaitResult</code> function is used to wait indefinitely and the <code>GetWaitHandle</code> function is used if we want to use a timeout.  Both of these are asynchronous workflows that either return a result or return an option type containing the result.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">PostAndTryAsyncReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="n">timeout</span> <span class="n">defaultTimeout</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">resultCell</span> <span class="o">=</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">replyChannelMsg</span><span class="o">(</span><span class="nc">AsyncReplyChannel</span><span class="o">&lt;_&gt;(</span><span class="k">fun</span> <span class="n">reply</span> <span class="o">-&gt;</span> <span class="n">resultCell</span><span class="o">.</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="n">reply</span><span class="o">)))</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">posted</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">msg</span><span class="o">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">posted</span> <span class="k">then</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">timeout</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span>   <span class="nn">Threading</span><span class="p">.</span><span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">result</span> <span class="o">=</span> <span class="n">resultCell</span><span class="o">.</span><span class="nc">AsyncWaitResult</span>
</span><span class='line'>                        <span class="k">return</span> <span class="nc">Some</span><span class="o">(</span><span class="n">result</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>        <span class="o">|</span>   <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">ok</span> <span class="o">=</span>  <span class="n">resultCell</span><span class="o">.</span><span class="nc">GetWaitHandle</span><span class="o">(</span><span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>                        <span class="k">let</span> <span class="n">res</span> <span class="o">=</span> <span class="o">(</span><span class="k">if</span> <span class="n">ok</span> <span class="k">then</span> <span class="nc">Some</span><span class="o">(</span><span class="n">resultCell</span><span class="o">.</span><span class="nc">GrabResult</span><span class="bp">()</span><span class="o">)</span> <span class="k">else</span> <span class="nc">None</span><span class="o">)</span>
</span><span class='line'>                        <span class="k">return</span> <span class="n">res</span> <span class="o">}</span>
</span><span class='line'>    <span class="k">else</span> <span class="n">async</span><span class="o">{</span><span class="k">return</span> <span class="nc">None</span><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h4>PostAndAsyncReply</h4>

<p>This member uses the same functionality as <code>PostAndTryAsyncReply</code>, creating a message using the <code>AsyncReplyChannel</code>.  The main
difference is that an asynchronous workflow is created that wraps a call to <code>PostAndTryAsyncReply</code> if the <code>timeout</code> is specified.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">PostAndAsyncReply</span><span class="o">(</span> <span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="n">timeout</span> <span class="n">defaultTimeout</span>
</span><span class='line'>    <span class="k">match</span> <span class="n">timeout</span> <span class="k">with</span>
</span><span class='line'>    <span class="o">|</span>   <span class="nn">Threading</span><span class="p">.</span><span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">resCell</span> <span class="o">=</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">replyChannelMsg</span> <span class="o">(</span><span class="nc">AsyncReplyChannel</span><span class="o">&lt;_&gt;(</span><span class="k">fun</span> <span class="n">reply</span> <span class="o">-&gt;</span> <span class="n">resCell</span><span class="o">.</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="n">reply</span><span class="o">)</span> <span class="o">))</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">posted</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">msg</span><span class="o">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">posted</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">resCell</span><span class="o">.</span><span class="nc">AsyncWaitResult</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="n">raise</span> <span class="o">(</span><span class="nc">InvalidOperationException</span><span class="o">(</span><span class="s2">&quot;Incoming message buffer full.&quot;</span><span class="o">))</span>
</span><span class='line'>    <span class="o">|</span>   <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">asyncReply</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="nc">PostAndTryAsyncReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>        <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">res</span> <span class="o">=</span> <span class="n">asyncReply</span>
</span><span class='line'>                <span class="k">match</span> <span class="n">res</span> <span class="k">with</span>
</span><span class='line'>                <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span>  <span class="k">return</span><span class="o">!</span> <span class="n">raise</span> <span class="o">(</span><span class="nc">TimeoutException</span><span class="o">(</span><span class="s2">&quot;PostAndAsyncReply TimedOut&quot;</span><span class="o">))</span>
</span><span class='line'>                <span class="o">|</span> <span class="nc">Some</span> <span class="n">res</span> <span class="o">-&gt;</span> <span class="k">return</span> <span class="n">res</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Static Start</h2>

<p>The static Start function is used as a way to construct and start the agent than using the constructor and then calling the Start function.  This is really just a simple short cut for this common use case.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">static</span> <span class="k">member</span> <span class="nc">Start</span><span class="o">(</span><span class="n">initial</span><span class="o">,</span> <span class="o">?</span><span class="n">cancellationToken</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">dfa</span> <span class="o">=</span> <span class="nc">DataflowAgent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Msg</span><span class="o">&gt;(</span><span class="n">initial</span><span class="o">,</span> <span class="o">?</span><span class="n">cancellationToken</span> <span class="o">=</span> <span class="n">cancellationToken</span><span class="o">)</span>
</span><span class='line'>    <span class="n">dfa</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span>
</span><span class='line'>    <span class="n">dfa</span>
</span></code></pre></td></tr></table></div></figure>


<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[F# Dataflow Agents Part I]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/01/22/FSharp-Dataflow-agents-I/"/>
    <updated>2012-01-22T12:28:00+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/01/22/FSharp-Dataflow-agents-I</id>
    <content type="html"><![CDATA[<p>This is going to be a new series on using TPL Dataflow with F#.  First a little bit of history and background.</p>

<h2>TPL Dataflows heritage and background</h2>

<p>TPL Dataflow or <a href="http://msdn.microsoft.com/en-us/devlabs/gg585582">(TDF)</a> has been around for quite a
while, it first surfaced more than a year ago as the successor to the Concurrency and Coordination Runtime
<a href="http://msdn.microsoft.com/en-us/library/bb648752.aspx">(CCR)</a> and with coming release of .Net 4.5 it will
be part of the <code>System.Threading.Tasks.Dataflow</code> namespace.  Elements of the now halted project
<a href="http://msdn.microsoft.com/en-us/devlabs/dd795202">Axum</a> are also present within the design of TDF.</p>

<h3>Concurrency and Coordination Runtime (CCR)</h3>

<p>CCR is a library that deals with asynchrony, concurrency, and coordination between blocks of asynchronous
code so that the programmer doesn&#8217;t have to.  All of the low level details of synchronization and error
propagation are taken care of in a consistent fashion.  CCR is still is included in
<a href="ttp://www.microsoft.com/robotics/">Microsoft Robotics Studio</a> where it is used extensively to exploit
parallel hardware and deal with partial failure of systems.</p>

<h3>Axum</h3>

<p>Axum was another interesting Microsoft research project, it also utilized the actor model embracing the
principles of isolation, and message-passing.  There was also extensive use  symbolic operators as a terse
short hand way to indicate operations between actors.  For example <code>&lt;--</code> defined a way to pass a message
to an actor. Theres was also a similarity to CCR as Axum used the concepts of Ports and channels in a similar
way.  It was a very interesting project and it was a shame it was put on hold.</p>

<h3>TPL Dataflow (TDF)</h3>

<p>TDF builds on CCR and Axum, consolidating and refine to produce a more friendly fluent interface, much in
the same vain as Language-Integrated Query <a href="http://msdn.microsoft.com/en-us/library/bb308959.aspx">(LINQ)</a>
and Reactive Extensions <a href="http://msdn.microsoft.com/en-us/data/gg577609">(RX)</a>.</p>

<p>TDF is built around a number of different blocks which can be combined or linked together.  There are three
different categories of blocks are as follows:</p>

<h4>Buffering Blocks</h4>

<p>Buffering blocks simply buffer data in various ways before passing the data on to another block.</p>

<ul>
<li> <code>BufferBlock&lt;'T&gt;</code>  - The BufferBlock act as a first-in-first-out (FIFO) queue, buffering each input.</li>
<li> <code>BroadcastBlock&lt;'T&gt;</code> - The BroadcastBlock linking to multiple targets copying the data to each of the
connected blocks.</li>
<li> <code>WriteOnceBlock&lt;'T&gt;</code> - The WriteOnceBlock acts like an immutable target, after an item first item
is passed to it, it effectively becomes read only.</li>
</ul>


<h4>Executor Blocks</h4>

<p>The executor blocks run user supplied code in the form of a lambda expressions or a <code>Task&lt;'T&gt;</code>.</p>

<ul>
<li> <code>ActionBlock&lt;'TInput&gt;</code> - The ActionBlock acts like the <code>Action&lt;'T&gt;</code> delegate performing an action
on each datum posted to it.</li>
<li> <code>TransformBlock&lt;'TInput,'TOutput&gt;</code> - The TransformBlock acts just like the ActionBlock except
that the action performed can have an output, this output is buffered and behaves just like a BufferBlock.</li>
<li> <code>TransformManyBlock&lt;'TInput,'TOutput&gt;</code> - The TransformManyBlock is just like a TransformBlock except
that is can produce more than one output for a given datum.</li>
</ul>


<h4>Joining Blocks</h4>

<p>The Joining Blocks Combining or join data together in different ways.</p>

<ul>
<li> <code>BatchBlock&lt;'T&gt;</code> - The BatchBlock Combines multiple single items together, the items are
represented by arrays of elements.  The items are grouped together is batches and then passed on to
another block.</li>
<li> <code>JoinBlock&lt;'T1,'T2,…&gt;</code> - The JoinBlock acts as a form of <code>Enumerable.Zip&lt;'T1,'T2,'TResult&gt;</code>
except the zip operation is performed on the items in the source array.</li>
<li> <code>BatchedJoinBlock&lt;'T1,'T2,…&gt;</code> This block as the name suggests simply aggregates the JoinBlock and
the BatchBlock together.</li>
</ul>


<p>Thats an ultra high level tour thats only just scratches the surface.  I recommend you check out the
<a href="http://www.microsoft.com/download/en/details.aspx?id=14782">Introduction to TPL Dataflow</a> document to read
up on the details.  Theres a few more resources in the <a href="http://msdn.microsoft.com/en-us/devlabs/gg585582">DevLabs area</a>
that you might find useful.  Hopefully this series should also shed a bit more light on TDF as we go along&#8230;</p>

<h3>F# Asynchronous Workflows and Agents</h3>

<p>So where does that leave us in F#?<br/>
In F# we have <a href="http://msdn.microsoft.com/en-us/library/dd233250.aspx">Asynchronous Workflows</a> and
<a href="http://msdn.microsoft.com/en-us/library/ee370357.aspx">agents</a> and they help immensely in the concurrency
and message passing, but that doest mean that we cant take advantage of the new features and refinements
much in the same way as we can use Asynchronous Workflows to take advantage of Tasks.</p>

<p>This post is going to be centered around F# agents but with a twist.  First of all are going to be
reimplementing a MailboxProcessor using TDF for the underlying processing.  This will allow us to to use
all of our existing agent code and examples and also stay within the F# agent paradigm.  Following this
approach we could also make use of the <code>DataflowBlockOptions</code> type, it has some interesting
properties which we will look at in future posts:</p>

<ul>
<li> TaskScheduler</li>
<li> CancellationToken</li>
<li> MaxMessagesPerTask</li>
<li> BoundedCapacity</li>
</ul>


<h3>Implementation</h3>

<p>In this post we are going replicate the MailboxProcessor, we will be using Tomas Petricek&#8217;s caching agent
example from <a href="http://fssnip.net/8V">FSSnip</a>).  I have made a couple of modification to Tomas&#8217;s code.<br/>
I replaced the Dictionary type with a ConcurrentDictionary so that the caching agent could be called multiple
times successively without the dictionary throwing an exception due to it already containing a key from a
previous cached result.  I also changed the example code so that it requests cached HTML from the caching
agent ten times with a 400ms interval in between each.</p>

<figure class='code'><figcaption><span>Caching Agent Implementation  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="nc">TplAgents</span>
</span><span class='line'><span class="k">open</span> <span class="nc">System</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Generic</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Concurrent</span>
</span><span class='line'><span class="k">open</span> <span class="nc">FsDataflow</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Net</span>
</span><span class='line'><span class="k">open</span> <span class="nn">Microsoft</span><span class="p">.</span><span class="nn">FSharp</span><span class="p">.</span><span class="nn">Control</span><span class="p">.</span><span class="nc">WebExtensions</span>
</span><span class='line'>
</span><span class='line'><span class="k">type</span> <span class="nc">CachingMessage</span> <span class="o">=</span>
</span><span class='line'><span class="o">|</span> <span class="nc">Add</span> <span class="k">of</span> <span class="kt">string</span> <span class="o">*</span> <span class="kt">string</span>
</span><span class='line'><span class="o">|</span> <span class="nc">Get</span> <span class="k">of</span> <span class="kt">string</span> <span class="o">*</span> <span class="nc">AsyncReplyChannel</span><span class="o">&lt;</span><span class="n">option</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">&gt;&gt;</span>
</span><span class='line'><span class="o">|</span> <span class="nc">Clear</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">caching</span> <span class="o">=</span> <span class="nn">DataflowAgent</span><span class="p">.</span><span class="nc">Start</span><span class="o">(</span><span class="k">fun</span> <span class="n">agent</span> <span class="o">-&gt;</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>   <span class="k">let</span> <span class="n">table</span> <span class="o">=</span> <span class="nc">ConcurrentDictionary</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">,</span> <span class="kt">string</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>   <span class="k">while</span> <span class="bp">true</span> <span class="k">do</span>
</span><span class='line'>      <span class="k">let</span><span class="o">!</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="nc">Receive</span><span class="bp">()</span>
</span><span class='line'>      <span class="k">match</span> <span class="n">msg</span> <span class="k">with</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Add</span><span class="o">(</span><span class="n">url</span><span class="o">,</span> <span class="n">html</span><span class="o">)</span> <span class="o">-&gt;</span>
</span><span class='line'>         <span class="c1">// Add downloaded page to the cache</span>
</span><span class='line'>         <span class="n">table</span><span class="o">.</span><span class="nc">AddOrUpdate</span><span class="o">(</span><span class="n">url</span><span class="o">,</span> <span class="n">html</span><span class="o">,</span> <span class="k">fun</span> <span class="n">k</span> <span class="n">v</span> <span class="o">-&gt;</span> <span class="n">html</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Get</span><span class="o">(</span><span class="n">url</span><span class="o">,</span> <span class="n">repl</span><span class="o">)</span> <span class="o">-&gt;</span>
</span><span class='line'>         <span class="c1">// Get a page from the cache - returns </span>
</span><span class='line'>         <span class="c1">// None if the value isn&#39;t in the cache</span>
</span><span class='line'>         <span class="k">if</span> <span class="n">table</span><span class="o">.</span><span class="nc">ContainsKey</span><span class="o">(</span><span class="n">url</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">repl</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="nc">Some</span> <span class="n">table</span><span class="o">.[</span><span class="n">url</span><span class="o">])</span>
</span><span class='line'>         <span class="k">else</span>
</span><span class='line'>            <span class="n">repl</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="nc">None</span><span class="o">)</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Clear</span> <span class="o">-&gt;</span>
</span><span class='line'>           <span class="n">table</span><span class="o">.</span><span class="nc">Clear</span><span class="bp">()</span> <span class="o">})</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Caching Agent Example  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="c1">/// Prints information about the specified web site using cache</span>
</span><span class='line'><span class="k">let</span> <span class="n">printInfo</span> <span class="n">url</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>   <span class="c1">// Try to get the cached HTML from the caching agent</span>
</span><span class='line'>   <span class="k">let</span><span class="o">!</span> <span class="n">htmlOpt</span> <span class="o">=</span> <span class="n">caching</span><span class="o">.</span><span class="nc">PostAndAsyncReply</span><span class="o">(</span><span class="k">fun</span> <span class="n">ch</span> <span class="o">-&gt;</span> <span class="nc">Get</span><span class="o">(</span><span class="n">url</span><span class="o">,</span> <span class="n">ch</span><span class="o">))</span>
</span><span class='line'>   <span class="k">match</span> <span class="n">htmlOpt</span> <span class="k">with</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span>
</span><span class='line'>       <span class="c1">// New url - download it and add it to the cache</span>
</span><span class='line'>       <span class="k">use</span> <span class="n">wc</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">WebClient</span><span class="bp">()</span>
</span><span class='line'>       <span class="k">let</span><span class="o">!</span> <span class="n">text</span> <span class="o">=</span> <span class="n">wc</span><span class="o">.</span><span class="nc">AsyncDownloadString</span><span class="o">(</span><span class="nc">Uri</span><span class="o">(</span><span class="n">url</span><span class="o">))</span>
</span><span class='line'>       <span class="n">caching</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="nc">Add</span><span class="o">(</span><span class="n">url</span><span class="o">,</span> <span class="n">text</span><span class="o">))</span>
</span><span class='line'>       <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span> <span class="n">sprintf</span> <span class="s2">&quot;Download: %s (%d)&quot;</span> <span class="n">url</span> <span class="n">text</span><span class="o">.</span><span class="nc">Length</span><span class="o">)</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Some</span> <span class="n">html</span> <span class="o">-&gt;</span>
</span><span class='line'>       <span class="c1">// The url was downloaded earlier </span>
</span><span class='line'>       <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span> <span class="n">sprintf</span> <span class="s2">&quot;Cached: %s (%d)&quot;</span> <span class="n">url</span> <span class="n">html</span><span class="o">.</span><span class="nc">Length</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">printfuncpro</span> <span class="o">=</span> <span class="n">printInfo</span> <span class="s2">&quot;http://functional-programming.net&quot;</span>
</span><span class='line'><span class="c1">// Print information about a web site -</span>
</span><span class='line'><span class="c1">// Run this repeatedly to use cached value</span>
</span><span class='line'><span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span> <span class="o">..</span> <span class="mi">10</span> <span class="k">do</span>
</span><span class='line'>   <span class="n">printfuncpro</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span>
</span><span class='line'>   <span class="nn">Async</span><span class="p">.</span><span class="nc">RunSynchronously</span> <span class="o">&lt;|</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">400</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Clear the cache - &#39;printInfo&#39; will need to</span>
</span><span class='line'><span class="c1">// download data from the web site again</span>
</span><span class='line'><span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span><span class="n">sprintf</span> <span class="s2">&quot;Clearing the cache&quot;</span><span class="o">)</span>
</span><span class='line'><span class="n">caching</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="nc">Clear</span><span class="o">)</span>
</span><span class='line'><span class="n">printfuncpro</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span>
</span><span class='line'>
</span><span class='line'><span class="nn">Console</span><span class="p">.</span><span class="nc">ReadKey</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looking at the implementation above you can see that we need to implement the following members:</p>

<ul>
<li> Start:<code>unit -&gt; unit</code></li>
<li> Receive:<code>?int -&gt; Async&lt;'Msg&gt;</code></li>
<li> Post:<code>'Msg -&gt; unit</code></li>
<li> PostAndTryAsyncReply:<code>(AsyncReplyChannel&lt;'Reply&gt; -&gt; 'Msg) * ?int -&gt; Async&lt;'Reply option&gt;</code></li>
<li> PostAndAsyncReply:<code>(AsyncReplyChannel&lt;'Reply&gt; -&gt; 'Msg) * int option -&gt; Async&lt;'Reply&gt;</code></li>
<li> static member Start:<code>(MailboxProcessor&lt;'Msg&gt; -&gt; Async&lt;unit&gt;) * ?CancellationToken -&gt; MailboxProcessor&lt;'Msg&gt;</code></li>
</ul>


<p>These are the only members we need to complete the caching agent example, I didn&#8217;t want bamboozle everyone
with an explosion of code from the onset so the remaining members will be implemented as and when we need
them.  When we have implemented all the members from MailboxProcessor Ill post the full source on my
 <a href="https://github.com/7sharp9">GitHub</a> account.</p>

<p> The following members will be outstanding but it should be fairly trivial to implement them
 once we have completed the code here.</p>

<ul>
<li> PostAndReply:<code>(AsyncReplyChannel&lt;'Reply&gt; -&gt; 'Msg) * int option -&gt; 'Reply</code></li>
<li> Scan:<code>('Msg -&gt; Async&lt;'T&gt; option) * ?int -&gt; Async&lt;'T&gt;</code></li>
<li> TryPostAndReply:<code>(AsyncReplyChannel&lt;'Reply&gt; -&gt; 'Msg) * ?int -&gt; 'Reply option</code></li>
<li> TryReceive:<code>?int -&gt; Async&lt;'Msg option&gt;</code></li>
<li> TryScan:<code>('Msg -&gt; Async&lt;'T&gt; option) * ?int -&gt; Async&lt;'T option&gt;</code></li>
<li> CurrentQueueLength:<code>int</code></li>
<li> DefaultTimeout:<code>int with get, set</code></li>
</ul>


<p>So here we go, this is the Dataflow implementation of the MailboxProcessor:</p>

<figure class='code'><figcaption><span>Dataflow Agent  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="nc">FsDataflow</span>
</span><span class='line'><span class="k">open</span> <span class="nc">System</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Threading</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Threading</span><span class="p">.</span><span class="nc">Tasks</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Threading</span><span class="p">.</span><span class="nn">Tasks</span><span class="p">.</span><span class="nc">Dataflow</span>
</span><span class='line'><span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Concurrent</span>
</span><span class='line'>
</span><span class='line'><span class="k">type</span> <span class="nc">DataflowAgent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Msg</span><span class="o">&gt;(</span><span class="n">initial</span><span class="o">,</span> <span class="o">?</span><span class="n">cancellationToken</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">cancellationToken</span> <span class="o">=</span>
</span><span class='line'>        <span class="n">defaultArg</span> <span class="n">cancellationToken</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">DefaultCancellationToken</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">mutable</span> <span class="n">started</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">errorEvent</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Event</span><span class="o">&lt;</span><span class="nn">System</span><span class="p">.</span><span class="nc">Exception</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">incomingMessages</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BufferBlock</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Msg</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">mutable</span> <span class="n">defaultTimeout</span> <span class="o">=</span> <span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">[&lt;</span><span class="nc">CLIEvent</span><span class="o">&gt;]</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Error</span> <span class="o">=</span> <span class="n">errorEvent</span><span class="o">.</span><span class="nc">Publish</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">started</span>
</span><span class='line'>            <span class="k">then</span> <span class="n">raise</span> <span class="o">(</span><span class="k">new</span> <span class="nc">InvalidOperationException</span><span class="o">(</span><span class="s2">&quot;Already Started.&quot;</span><span class="o">))</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>            <span class="n">started</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">comp</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span> <span class="k">try</span> <span class="k">do</span><span class="o">!</span> <span class="n">initial</span> <span class="n">this</span>
</span><span class='line'>                               <span class="k">with</span> <span class="n">error</span> <span class="o">-&gt;</span> <span class="n">errorEvent</span><span class="o">.</span><span class="nc">Trigger</span> <span class="n">error</span> <span class="o">}</span>
</span><span class='line'>            <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span><span class="o">(</span><span class="n">computation</span> <span class="o">=</span> <span class="n">comp</span><span class="o">,</span> <span class="n">cancellationToken</span> <span class="o">=</span> <span class="n">cancellationToken</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Receive</span><span class="o">(?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="nn">Async</span><span class="p">.</span><span class="nc">AwaitTask</span> <span class="o">&lt;|</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">ReceiveAsync</span><span class="bp">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">item</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">posted</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">item</span><span class="o">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="ow">not</span> <span class="n">posted</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">raise</span> <span class="o">(</span><span class="nc">InvalidOperationException</span><span class="o">(</span><span class="s2">&quot;Incoming message buffer full.&quot;</span><span class="o">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">PostAndTryAsyncReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="n">timeout</span> <span class="n">defaultTimeout</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">resultCell</span> <span class="o">=</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">replyChannelMsg</span><span class="o">(</span><span class="nc">AsyncReplyChannel</span><span class="o">&lt;_&gt;(</span><span class="k">fun</span> <span class="n">reply</span> <span class="o">-&gt;</span> <span class="n">resultCell</span><span class="o">.</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="n">reply</span><span class="o">)))</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">posted</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">msg</span><span class="o">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">posted</span> <span class="k">then</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">timeout</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span>   <span class="nn">Threading</span><span class="p">.</span><span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span> <span class="o">-&gt;</span>
</span><span class='line'>                    <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">result</span> <span class="o">=</span> <span class="n">resultCell</span><span class="o">.</span><span class="nc">AsyncWaitResult</span>
</span><span class='line'>                            <span class="k">return</span> <span class="nc">Some</span><span class="o">(</span><span class="n">result</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>            <span class="o">|</span>   <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class='line'>                    <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">ok</span> <span class="o">=</span>  <span class="n">resultCell</span><span class="o">.</span><span class="nc">GetWaitHandle</span><span class="o">(</span><span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>                            <span class="k">let</span> <span class="n">res</span> <span class="o">=</span> <span class="o">(</span><span class="k">if</span> <span class="n">ok</span> <span class="k">then</span> <span class="nc">Some</span><span class="o">(</span><span class="n">resultCell</span><span class="o">.</span><span class="nc">GrabResult</span><span class="bp">()</span><span class="o">)</span> <span class="k">else</span> <span class="nc">None</span><span class="o">)</span>
</span><span class='line'>                            <span class="k">return</span> <span class="n">res</span> <span class="o">}</span>
</span><span class='line'>        <span class="k">else</span> <span class="n">async</span><span class="o">{</span><span class="k">return</span> <span class="nc">None</span><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">PostAndAsyncReply</span><span class="o">(</span> <span class="n">replyChannelMsg</span><span class="o">,</span> <span class="o">?</span><span class="n">timeout</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">defaultArg</span> <span class="n">timeout</span> <span class="n">defaultTimeout</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">timeout</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span>   <span class="nn">Threading</span><span class="p">.</span><span class="nn">Timeout</span><span class="p">.</span><span class="nc">Infinite</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">resCell</span> <span class="o">=</span> <span class="nc">AsyncResultCell</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">replyChannelMsg</span> <span class="o">(</span><span class="nc">AsyncReplyChannel</span><span class="o">&lt;_&gt;(</span><span class="k">fun</span> <span class="n">reply</span> <span class="o">-&gt;</span> <span class="n">resCell</span><span class="o">.</span><span class="nc">RegisterResult</span><span class="o">(</span><span class="n">reply</span><span class="o">)</span> <span class="o">))</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">posted</span> <span class="o">=</span> <span class="n">incomingMessages</span><span class="o">.</span><span class="nc">Post</span><span class="o">(</span><span class="n">msg</span><span class="o">)</span>
</span><span class='line'>                <span class="k">if</span> <span class="n">posted</span> <span class="k">then</span>
</span><span class='line'>                    <span class="n">resCell</span><span class="o">.</span><span class="nc">AsyncWaitResult</span>
</span><span class='line'>                <span class="k">else</span>
</span><span class='line'>                    <span class="n">raise</span> <span class="o">(</span><span class="nc">InvalidOperationException</span><span class="o">(</span><span class="s2">&quot;Incoming message buffer full.&quot;</span><span class="o">))</span>
</span><span class='line'>            <span class="o">|</span>   <span class="o">_</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">asyncReply</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="nc">PostAndTryAsyncReply</span><span class="o">(</span><span class="n">replyChannelMsg</span><span class="o">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="o">)</span>
</span><span class='line'>                <span class="n">async</span> <span class="o">{</span> <span class="k">let</span><span class="o">!</span> <span class="n">res</span> <span class="o">=</span> <span class="n">asyncReply</span>
</span><span class='line'>                        <span class="k">match</span> <span class="n">res</span> <span class="k">with</span>
</span><span class='line'>                        <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span>  <span class="k">return</span><span class="o">!</span> <span class="n">raise</span> <span class="o">(</span><span class="nc">TimeoutException</span><span class="o">(</span><span class="s2">&quot;PostAndAsyncReply TimedOut&quot;</span><span class="o">))</span>
</span><span class='line'>                        <span class="o">|</span> <span class="nc">Some</span> <span class="n">res</span> <span class="o">-&gt;</span> <span class="k">return</span> <span class="n">res</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="nc">Start</span><span class="o">(</span><span class="n">initial</span><span class="o">,</span> <span class="o">?</span><span class="n">cancellationToken</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">dfa</span> <span class="o">=</span> <span class="nc">DataflowAgent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">Msg</span><span class="o">&gt;(</span><span class="n">initial</span><span class="o">,</span> <span class="o">?</span><span class="n">cancellationToken</span> <span class="o">=</span> <span class="n">cancellationToken</span><span class="o">)</span>
</span><span class='line'>        <span class="n">dfa</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span>
</span><span class='line'>        <span class="n">dfa</span>
</span></code></pre></td></tr></table></div></figure>


<p>The crux of the implementation from TDF&#8217;s point of view is the use of the BufferBlock.<br/>
This is one of the most fundamental blocks within TDF.  Its the equivalent of the <code>Port&lt;'T&gt;</code>
type from CCR and the <code>Mailbox</code> type from F# which is used internally within the
MailboxProcessor.  As mentioned abouve the BufferBlock type is a first-in-first-out (FIFO) buffer
and is responsible for buffering any data that is Posted to it.</p>

<p>OK, I&#8217;m going to leave it at that for now while you digest the code presented here.</p>

<p>In part II I will be drilling into the detail on whats going on internally and also describing more
of the TDF model, so tune in soon for Part II.</p>

<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moved To Octopress...]]></title>
    <link href="http://MoiraeSoftware.com/blog/2012/01/08/moved-to-octopress/"/>
    <updated>2012-01-08T22:30:00+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2012/01/08/moved-to-octopress</id>
    <content type="html"><![CDATA[<p><img class="left" src="http://octopress.org/images/logo.png" width="150">Well I finally did it, I moved my blog from <a href="http://wordpress.com/">Wordpress</a> to <a href="http://octopress.org/">Octopress</a>, what drove me to make this move?</p>

<p>Well, there were a few factors involved&#8230;<!-- more --></p>

<p>I found the following problems and frustrations with Wordpress:</p>

<ul>
<li>Changing a Wordpress theme is somewhat of a black art.</li>
<li>My blog didn&#8217;t look its best on mobile devices, there was no fluid layout.</li>
<li>Wordpress seems to introduce a fair bit of latency for somethings thats essentially a simple task
i.e. get some text from a database.</li>
<li>Reliance on a database.<br/>
All my post were in a MySQL database although easily maintained I had to have it hosted somewhere.</li>
<li>Work press editing is both buggy and frustrating.<br/>
I used to get near the end of a complex post only to find that save draft crashed the editor and I lost all my changes!</li>
<li>Embedding code into a blog involved a Wordpress plugin, a Visual Studio plugin and manual manipulation of Html.</li>
</ul>


<p>So what do I get from Octopress?</p>

<p>In a single word:</p>

<h3>Simplicity</h3>

<ul>
<li>No database or hosting is is needed, the blog is statically generated and all hosted on <a href="https://github.com/">Github</a>.</li>
<li>I don&#8217;t need to use a clunky web based editor.  I can use a simple text editor as all post are written in .markdown format.</li>
<li>I get a nice simple elegant blog:

<ul>
<li>A Semantic Html 5 template.</li>
<li>A Mobile first responsive layout.</li>
<li>Built in 3rd party support for Twitter, Google Plus One, Disqus Comments, Pinboard, Delicious, and Google Analytics.</li>
<li>An easy deployment strategy using Github pages or Rsync.</li>
<li>Built in support for POW and Rack servers.</li>
<li>Easy theming with Compass and Sass.</li>
<li>A Beautiful Solarized syntax highlighting.</li>
</ul>
</li>
</ul>


<p>So here here I am with my first post, I&#8217;m really pleased so far.  If you want to find out more details on
 how this all works checkout <a href="http://octopress.org/">Octopress</a>.</p>

<p>Until next time.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fixing a hole...]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/12/11/fixing-a-hole/"/>
    <updated>2011-12-11T23:30:48+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/12/11/fixing-a-hole</id>
    <content type="html"><![CDATA[<p>Due to popular demand&#8230; well, I had a couple of requests anyway :-) Heres
a post inspired by my recent encounters profiling some of the code in
<a href="https://github.com/fractureio/fracture">Fracture-IO</a>.  <!-- more -->I have recently been
profiling the code in fracture to remove any so called low hanging fruits.
During this time I also noticed an increase in memory allocation.  I
remembered I had recently been experimenting in a branch using pipelets as a
buffer between the send and receive stages in the Http Server, so I set up a
simple test to see if pipelets were contributing to the memory allocation
issues I was seeing.  Here&#8217;s the simple iteration test code I used for the
memory profiling:</p>

<div><script src='https://gist.github.com/1557610.js?file=test_code.fs'></script>
<noscript><pre><code>    open System
    open System.Diagnostics
    open System.Threading
    open Fracture.Pipelets  
    let reverse (s:string) =
      String(s |&gt; Seq.toArray |&gt; Array.rev)  
    let oneToSingleton a b f=
      let result = b |&gt; f
      result |&gt; Seq.singleton  
    /// Total number to run through test cycle
    let number = 100  
    /// To Record when we are done
    let counter = ref 0
    let sw = new Stopwatch()
    let countThis (a:String) =
      do Interlocked.Increment(counter) |&gt; ignore
      if !counter % number = 0 then
        sw.Stop()
        printfn &quot;Execution time: %A&quot; sw.Elapsed.TotalMilliseconds
        printfn &quot;Items input: %d&quot; number
        printfn &quot;Time per item: %A ms (Elapsed Time / Number of items)&quot;
          (TimeSpan.FromTicks(sw.Elapsed.Ticks / int64 number).TotalMilliseconds)
        printfn &quot;Press any key to repeat, press 'q' to exit.&quot;
        sw.Reset()
      counter |&gt; Seq.singleton  
    let OneToSeqRev a b =
      oneToSingleton a b reverse   
    let generateCircularSeq (s) =
      let rec next () =
        seq {
          for element in s do
            yield element
          yield! next()
        }
      next()  
    let stage1 = new Pipelet&lt;_,_&gt;(&quot;Stage1&quot;, OneToSeqRev &quot;1&quot;, Routers.roundRobin, number, -1)
    let stage2 = new Pipelet&lt;_,_&gt;(&quot;Stage2&quot;, OneToSeqRev &quot;2&quot;, Routers.basicRouter, number, -1)
    let stage3 = new Pipelet&lt;_,_&gt;(&quot;Stage3&quot;, OneToSeqRev &quot;3&quot;, Routers.basicRouter, number, -1)
    let stage4 = new Pipelet&lt;_,_&gt;(&quot;Stage4&quot;, OneToSeqRev &quot;4&quot;, Routers.basicRouter, number, -1)
    let stage5 = new Pipelet&lt;_,_&gt;(&quot;Stage5&quot;, OneToSeqRev &quot;5&quot;, Routers.basicRouter, number, -1)
    let stage6 = new Pipelet&lt;_,_&gt;(&quot;Stage6&quot;, OneToSeqRev &quot;6&quot;, Routers.basicRouter, number, -1)
    let stage7 = new Pipelet&lt;_,_&gt;(&quot;Stage7&quot;, OneToSeqRev &quot;7&quot;, Routers.basicRouter, number, -1)
    let stage8 = new Pipelet&lt;_,_&gt;(&quot;Stage8&quot;, OneToSeqRev &quot;8&quot;, Routers.basicRouter, number, -1)
    let stage9 = new Pipelet&lt;_,_&gt;(&quot;Stage9&quot;, OneToSeqRev &quot;9&quot;, Routers.basicRouter, number, -1)
    let stage10 = new Pipelet&lt;_,_&gt;(&quot;Stage10&quot;, OneToSeqRev &quot;10&quot;, Routers.basicRouter, number, -1)
    let final = new Pipelet&lt;_,_&gt;(&quot;Final&quot;, countThis, Routers.basicRouter, number, -1)  
    let manyStages = [stage2;stage3;stage4;stage5;stage6;stage7;stage8;stage9;stage10]  
    oneToMany stage1 manyStages
    manyToOne manyStages final  
    System.AppDomain.CurrentDomain.UnhandledException |&gt; Observable.add (fun x -&gt;
      printfn &quot;%A&quot; (x.ExceptionObject :?&gt; Exception); Console.ReadKey() |&gt; ignore)  
    let circ = [&quot;John&quot;; &quot;Paul&quot;; &quot;George&quot;; &quot;Ringo&quot;; &quot;Nord&quot;; &quot;Bert&quot;] |&gt; generateCircularSeq   
    let startoperations() =
      sw.Start()
      for str in circ |&gt; Seq.take number
        do  str --&gt; stage1
      printfn &quot;Insert complete waiting for operation to complete.&quot;  
    printfn &quot;Press any key to process %i items&quot; number
    while not (Console.ReadKey().Key = ConsoleKey.Q) do
      startoperations()
</code></pre></noscript></div>


<p>Using process explorer from Mark Russinovich I watched the allocated memory
grow as the iterations progressed:</p>

<p><img src="https://lh4.googleusercontent.com/-VP1-Vo2VINU/TuS7yZFTTlI/AAAAAAAABNw/3ksn5vNXTtw/s400/leak.png"></p>

<p>Theres definitely something leaking in there! So what can we do to find this?
Simple, we use a memory profiler.  There are several really good memory
profilers out there.  I have listed some of the best ones below:</p>

<ul>
<li><a href="http://memprofiler.com/">SciTech memory profiler</a></li>
<li><a href="http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/">RedGates ANTS Memory Profiler</a></li>
<li><a href="http://www.jetbrains.com/profiler/">JetBrains dotTrace</a></li>
<li><a href="http://www.yourkit.com/dotnet/features/index.jsp">YourKit Profiler for .NET</a>
To demonstrate finding the leak I will be using <a href="http://www.red-gate.com/products/dotnet-development/ants-memory-%0Aprofiler/">RedGates ANTS MemoryProfiler</a>.</li>
</ul>


<p>First of all we launch the profiler and set it up to profile the application,
this is just a simple case of browsing to the release folder and picking the
application so I won&#8217;t bore with those trivial details here. Now that the
application is running we hit any key which caused the test application to
post 100 operations into the pipeline.  We want to create a baseline snapshot
of the memory allocation so we can see where our leak is.  To do this click
Take Memory Snapshot at the top right of the screen.  Next we hit any key
again in the test application, again causing it to post another 100 operations
into the pipeline.  Now we click Take Memory Snapshot again. Now we have a
snapshot of the difference between the two operations.  The summery screen is
shown below:</p>

<p><img src="https://lh4.googleusercontent.com/-N72POVbq0ZA/TuS7v0xBt1I/AAAAAAAABNQ/ExKfkJDCb50/s912/3%2Bsummary.png"></p>

<p>From this screen you can see that there is 51.56KB of new memory allocated
since the last snapshot, and you can see some nice piecharts showing the
various allocations in G1, G2 etc.  On the right hand side of the pie chart
you can see that the largest classes are: object[], AsyncParamsAux,
Pipelets+loop@37-7&lt;Unit, string,string>, and AsyncParams<Unit>.</p>

<p>Now if we click on Class List button we can investigate these further, heres
the Class List:</p>

<p><img src="https://lh4.googleusercontent.com/-UDU20rPk7ck/TuS7xvK_67I/AAAAAAAABNg/tnxTlpBYBJg/s912/4%2Bclass%2Blist.png"></p>

<p>Here things start to get interesting.  If you click on the instance Diff (+/-)
column you can sort the list of classed by the differences to the last
snapshot.</p>

<p>Now looking at the results we have:</p>

<ul>
<li>300 more instances of AsyncBuilderImpl, AsyncParamsArgs, and AsyncParams</li>
<li>200 more instances of Pipelets+loop@37-7&lt;Unit, string, string></li>
<li>100 more instances of Pipelets+loop@37-7&lt;Unit, string, FSharpRef<int>></li>
</ul>


<p>Is it a coincidence that we just pushed 100 operations through the pipeline?
I think not!</p>

<p>Now that we have a target for further inspection we can highlight the row for
the function <strong>Pipelets+loop@37-7&lt;Unit, string, FSharpRef<int>>></strong> and then
click on the icon that has three little blue boxes on it.  This will take us
to the instance List as shown below:</p>

<p><img src="https://lh6.googleusercontent.com/-csF589rWobQ/TuS7wzT6NWI/AAAAAAAABNY/TM95SUmaCEQ/s912/5%2Binstance%2Blist.png"></p>

<p>I have sorted the instance list by the distance from the GC Root, you can see
there is a strange pattern emerging, the GC root distant increase by three
each time.  Now lets look at the Instance Retention graph for the first one
with a GC Root distance of 9, this is the icon on the right hand side of the
function name, it looks like a few rectangles joined up with a line:</p>

<p><img src="https://lh3.googleusercontent.com/-9orgQ4etsdI/TuS7yE-Dh7I/AAAAAAAABNs/0-dc3x8u-Mo/s525/first.png"></p>

<p>The Pipelets+loop function is linked from the mailbox processor shown at the
top of the graph and flows into the Async infrastructure, and finally to the
loop function at the bottom.</p>

<p>Lets look at the next one, this has a GC Root distance of 12:</p>

<p><img src="https://lh3.googleusercontent.com/-j1eALRVz0kA/TuS7z0ycXDI/AAAAAAAABN8/SGPVpPQbSz0/s531/second.png"></p>

<p>If you look carefully there is another pattern here, the field references
args, aux@, econt@ are repeated in the red boxes.  The functions look to be
quite similar too.  Lets look at the next one GC Root Distance  of 15:</p>

<p><img src="https://lh6.googleusercontent.com/-d3V1WkCktTM/TuS7zxVnizI/AAAAAAAABOA/wA5xlP-UTxA/s646/third.png"></p>

<p>Looking at this we have a definite repeat of the functions and arguments,  if
we look down to GC Root at a depth of 60 we get this:</p>

<p><img src="https://lh3.googleusercontent.com/-X3v-_UfEkI4/TuS7xzETTHI/AAAAAAAABNk/js7xg3GTHIo/s640/60.png"></p>

<p>So whats happening here is that there is a continuation that has been built
around the asynchronous calls that gets bigger and bigger on each iteration.</p>

<p>Now that we have identified the leak, lets look at the code and see whats
going on.  That would be the loop function in Pipelets:</p>

<div><script src='https://gist.github.com/1557610.js?file=leaky_mailbox.fs'></script>
<noscript><pre><code>    let mailbox = MailboxProcessor.Start(fun inbox -&gt;
      let rec loop routes = async {
        let! msg = inbox.Receive()
        match msg with
        | Payload(data) -&gt;
          ss.Release() |&gt; ignore
          try
            data |&gt; transform |&gt; router &lt;| routes
            return! loop routes
          with //force loop resume on error
          | ex -&gt; errors ex
              return! loop routes
        | Attach(stage) -&gt; return! loop (stage::routes)
        | Detach(stage) -&gt; return! loop (List.filter (fun x -&gt; x &lt;&gt; stage) routes)
      }
      loop [])</code></pre></noscript></div>


<p>Have a look at lines 9 and 12.  Can you guess whats wrong?</p>

<p>Well, to quote the <a href="http://blogs.msdn.com/b/fsharpteam/archive/2011/07/08/tail-calls-in-fsharp.aspx">F# Teams blog</a>:</p>

<blockquote><p>On the .NET platform, there are limitations on where tail calls may occur.
One restriction is that tail calls cannot be performed in try-catch or try-
finally blocks (neither in the body of the try nor in the catch or finally
handlers).</p></blockquote>

<p>It goes on further to discuss another subtle issue with use bindings:</p>

<blockquote><p>use bindings implicitly generate a try-finally around the code that follows
them to ensure that the Dispose method is called on the bound value.  This
means that no calls following a use binding will be tail calls.</p></blockquote>

<p>So all we have to do change the way the try catch block is formulated in that
section.  The most idiomatic way of dealing with this is to use the
<a href="http://msdn.microsoft.com/en-us/library/ee353899.aspx">Async.Catch function</a>
which would result in code something like the following:</p>

<div><script src='https://gist.github.com/1557610.js?file=async_catch.fs'></script>
<noscript><pre><code>    let mailbox = MailboxProcessor.Start(fun inbox -&gt;
      let rec loop routes = async {
        let! msg = inbox.Receive()
        match msg with
        | Payload(data) -&gt;
          ss.Release() |&gt; ignore
          let result = async{data |&gt; transform |&gt; router &lt;| routes} |&gt; Async.Catch |&gt; Async.RunSynchronously
          match result with
          | Choice1Of2() -&gt; ()
          | Choice2Of2 exn -&gt; errors exn
          return! loop routes
        | Attach(stage) -&gt; return! loop (stage::routes)
        | Detach(stage) -&gt; return! loop (List.filter (fun x -&gt; x &lt;&gt; stage) routes)
      }
      loop [])</code></pre></noscript></div>


<p>Alternatively you could move the entire try with section out to a more local
section thats not in the recursive async loop construct:</p>

<div><script src='https://gist.github.com/1557610.js?file=move_try.fs'></script>
<noscript><pre><code>    let computeAndRoute data routes =
      try
        data |&gt; transform |&gt; router &lt;| routes
        Choice1Of2()
      with
      | ex -&gt; Choice2Of2 ex  

    let mailbox = MailboxProcessor.Start(fun inbox -&gt;
      let rec loop routes = async {
        let! msg = inbox.Receive()
        match msg with
        | Payload(data) -&gt;
          ss.Release() |&gt; ignore
          match computeAndRoute data routes with
          | Choice2Of2 exn -&gt; errors exn
          | _ -&gt; ()
          return! loop routes
        | Attach(stage) -&gt; return! loop (stage::routes)
        | Detach(stage) -&gt; return! loop (List.filter (fun x -&gt; x &lt;&gt; stage) routes)
      }
      loop [])</code></pre></noscript></div>


<p>Anyway I hope that sheds a bit of light on how to spot where memory leaks are
stemming from, and also some of the little known and often forgotten caveats
with tail recursion.</p>

<p>Until next time&#8230;</p>

<p><strong>EDIT</strong>: Just to make things a little bit clearer.  The memory leak here is caused by the async block being transformed into chains of continuation passing-style functions, and due to tail call elimination not being possible inside of the try catch blocks, the continuation grows and grows during each recursion.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build 2011 - A quick look]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/09/14/build-2011-a-quick-look/"/>
    <updated>2011-09-14T00:08:42+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/09/14/build-2011-a-quick-look</id>
    <content type="html"><![CDATA[<p>Well, I didn&#8217;t think I would be doing this but heres some of the sessions Im looking forward to watching from this years Build conference.<!-- more --></p>

<h2>Server / Cloud</h2>

<p>Obviously first up is the F# 3.0 session by Don Syme, really looking forward to this session!</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-904T"><strong>F# 3.0: data, services, Web, cloud, at your fingertips</strong></a></p>

<p>Modern programming thrives on rich spaces of data, information and services.  With F# 3.0 and Visual Studio 11, you now have a tool that massively
simplifies information-rich analytical programming. F# 3.0 provides integrated support for F# Information Rich Programming, a new and powerful way of
integrating data and services into your programming experience. In this talk, we will describe the new features of F# 3.0, including the first released
version of F# Type Providers and F# Queries, with apps to leverage technologies such as SharePoint, Azure Data Market, OData, Entity Framework and SQL Server.</p>

<p>One of the areas I have a big interest in is performance so the next session will be interesting.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-417T"><strong>Windows Server performance improvements and optimisations</strong></a></p>

<p>This session discusses the major performance improvements of Windows Server 8 and demonstrates how customers and partners can achieve their performance and
scalability goals. We will describe some of the ways you can take advantage of the new capabilities to improve scalability, networking, throughput, and get a
more powerful virtualization experience with Windows Server 8.</p>

<p>Network performance is another area I have a big interesting so this session will be good to see.</p>

<p><strong><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-593T">New techniques to develop low-latency network apps</a></strong></p>

<p>For performance-critical apps, every microsecond saved means money.  Windows Server 8 makes it possible to increase throughput, handle higher message
rates, reduce latency and jitter, and lower CPU usage, all with standard server hardware. The new Registered I/O (RIO) model in Windows 8 delivers a
low-latency solution while maintaining on-the-wire compatibility with existing TCP and UDP protocols. Additionally, a new fast path loopback allows high-
speed apps to achieve a higher level of performance. Attend this session to learn how to program and tune these new capabilities and to witness them in
action.</p>

<p>Parallel programming is a topic that deserves more attention so it will be good to see what the next in this area.</p>

<p><strong><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-808T">Building parallelized apps with .NET and Visual Studio</a></strong></p>

<p>The Task Parallel Library (TPL), PLINQ, and Visual Studio 2010 provide managed code developers with a solid foundation for parallelizing loops, queries, and
other common constructs in both server and client apps. But that’s only the beginning. In this code-intensive session, learn about what’s next for
parallelization with .NET and Visual Studio, diving deep into performance enhancements, new Visual Studio tooling, and new libraries and language
support for parallelization and asynchrony.</p>

<p>Next up here are the sessions in the Tools section that I will be taking a look at.</p>

<h2>Tools</h2>

<p>I will probably use this session to see if F# will map easily over to the new Windows Runtime</p>

<p><strong><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-531T">Using the Windows Runtime from C# and Visual Basic</a></strong></p>

<p>C#, Visual Basic and the .NET tools have first-class support for the Windows Runtime. Learn about this integration and how to use C# and Visual Basic to
write Metro style apps that call the Windows Runtime and how to build libraries that integrate with your Metro style apps using HTML.</p>

<p>DirectX isn&#8217;t really something I spend a lot of time doing but I like to keep my hand in.</p>

<p><strong><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-761T">A lap around DirectX game development tools</a></strong></p>

<p>Visual Studio 11 brings the most significant set of improvements for developing graphics-intensive apps in over a decade. Whether you are just
getting started with 2D/3D games or a self-proclaimed &#8220;guru,&#8221; there&#8217;s something for you in this talk. We will walkthrough a slew of new tools
integrated into Visual Studio that will make your life better.</p>

<p>I dont tend to spend as much time in the debugger with F# but when I do this information will be good to know.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-792T"><strong>Advanced IntelliTrace in production with Visual Studio 11</strong></a></p>

<p>Did you ever have that bug that you just could not reproduce? Not getting enough information from production environments to really solve your problems
quickly? Why does it always take way longer to figure out what the problem is then to make the fix? In this session, see how IntelliTrace, within Visual
Studio 11, gives you the ability retrieve rich, detailed information about problems, even in production, enabling you to spend less time on bug
diagnostics and more time writing software.</p>

<p>Again this section will be good to see just to find out if this can be ported over to F#</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-802T"><strong>Taming GPU compute with C++ AMP</strong></a></p>

<p>Developers today inject parallelism into their compute-intensive apps in order to take advantage of multi-core CPU hardware. Beyond CPUs, however, compute
accelerators such as general-purpose GPUs can provide orders of magnitude speed-ups for data parallel algorithms. How can you as a C++ developer fully
utilize this heterogeneous hardware from your Visual Studio environment?  How can you benefit from this tremendous performance boost in your Visual C++
solutions without sacrificing developer productivity? The answers will be presented in this session introducing C++ AMP.</p>

<p>Delving into the depths of stuff is always interesting so this will be great.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-813T"><strong>Deep dive into the kernel of the .NET Framework</strong></a></p>

<p>The Common Language Runtime is the cutting-edge virtual machine at the heart of the .NET Framework. In this session, we&#8217;ll dive deep under the covers of
the CLR and discuss some of our key innovations for .NET Framework 4.5 and Windows 8. Topics will include updates in the code-generation and diagnostics
space, improvements in our garbage collector for low latency server scenarios, and automatic NGen.</p>

<p>It will be good to keep up with the latest developments in the C# world.  The new async/await features are heavily influenced by F#&#8217;s Asynchronous workflows.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-816T"><strong>Future directions for C# and Visual Basic</strong></a></p>

<p>In this talk, Technical Fellow Anders Hejlsberg will share project plans for the future directions of C# and Visual Basic, including a discussion of what
trends are influencing and shaping the direction of programming languages.  Anders will talk about asynchronous programming and Windows 8 programming,
coming in the next version of Visual Studio. He will also discuss the long-lead project “Roslyn”, including object models for code generation, analysis,
and refactoring, and upcoming support for scripting and interactive use of C# and Visual Basic</p>

<p>New features of Visual Studio are always good to know.</p>

<p><strong><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-820F">What&#8217;s new in Visual Studio 11</a></strong></p>

<p>Microsoft Visual Studio 11 enable developers to take full advantage of the capability of Windows using the skills and technologies developers already
know and love to deliver exceptional and compelling apps. Whether working individually or in a small, medium or large development team the Visual Studio
11 sets a new standard for development tools, helping teams deliver superior results for their customers that help set them apart from their competitors.
In this session we’ll walk through the new features in the Visual Studio 11 Developer Preview to give you an understanding of the breadth of tooling
available in this release.</p>

<p>Looking forward to hearing about the new .NET 4.5 features.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/TOOL-834T"><strong>What&#8217;s new in .NET Framework 4.5</strong></a></p>

<p>The next major release of the .NET Framework, .NET 4.5, allows you to easily use Windows 8 technologies, like Windows Runtime, directly from .NET 4.5.
Accessing your data is easier than ever with support for the newest features in SQL Server and support for WebSockets. Programs are more responsive, with
the AWAIT keyword, faster ASP.NET startup and an improved server Garbage Collector. .NET 4.5 incorporates key customer feedback, with the newest MEF
features, support for long running workflows with State Machines, and improved HTML 5 support in ASP.NET. In this overview talk, you’ll learn about all of
these technologies, and get pointers to deeper dives where you can learn more.</p>

<p>Finally heres the session in the platform section that I find interesting.</p>

<h2>Platform</h2>

<p>Socket based programming is an interesting area, at least it is for me, so this should be an interesting session.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-580T"><strong>Building Windows runtime sockets apps</strong></a></p>

<p>Today&#8217;s networks have grown more complicated as a result of multihoming, web proxies, security issues, internationalization and other issues. Because
dealing with these complexities is hard, it is either ignored or significant resources are spent attempting to do so. In this session, we will demonstrate
how the Windows Runtime sockets API simplifies what an app must do to use TCP or UDP. We also will present exciting new functionality, such as proximity
discovery and using WebSockets for HTTP proxy traversal, as well as how to handle complex security and cost issues.</p>

<p>Looking throughout the more client based areas in the platform section the next two might be worth a look.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-769T"><strong>Achieving high performance 2D graphics with Direct2D</strong></a></p>

<p>Make it fast! Great performance is a huge motivator of satisfaction and user preference with apps. Direct 2D powers high-performance 2D graphics rendering
in Windows 8. In this session, you will learn advanced techniques for optimizing your Direct2D code for maximum speed and efficiency in your apps.</p>

<p><a href="http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-770T"><strong>Create cool image effects with Direct2D</strong></a></p>

<p>Every day, people are using apps that process images to create a variety of effects. The new image processing infrastructure in Windows 8 enables apps to
perform high-performance image enhancements, transformation and composition using the GPU for photos, vector graphics and UI elements. In this session,
you will learn about the Direct2D effect API, and see how easy it is to apply effects to photos and 2D and 3D content in your Windows 8 app to deliver more
polished visual experiences to your customers.</p>

<p>I had a look through the Apps and Hardware sections but there were not any specific areas in there that I found really interesting.</p>

<p>Wow this post is a bit longer than I wanted it to be!  There looks to be some very interesting sessions here, lots of Metro based
information but Ill be keeping a bit of a distance from that stuff to concentrate on the server-side material for now.</p>

<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[F# and Design principles - SOLID]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/08/22/fsharp_solid/"/>
    <updated>2011-08-22T23:30:52+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/08/22/fsharp_solid</id>
    <content type="html"><![CDATA[<h2>SOLID and its relevance to F#</h2>

<p>There has been an increasing amount of exposure for F# and functional
programming lately.  If you come from an object-orientated background a change
in mindset is required when working with functional programming, there is a
lot of misinformation on functional languages and their relationship with
object-orientated design.  In this post we run quickly through SOLID to see if these object-orientated principles apply to F#, and if so, how.<!-- more --></p>

<p>This post assumes you are familiar with SOLID principles, if not here is a
<a href="http://en.wikipedia.org/wiki/SOLID_(object-oriented_design">link</a>. </p>

<p>Lets take a quick overview of what SOLID stands for:</p>

<h2>Single responsibility principle</h2>

<p>This is the notion that an object should have only a single responsibility.</p>

<p>An object-orientated program consists of layers of abstract classes with less
abstract classes layered on top of ones that are more abstract.  Functional
programming is similar, although abstractions are used throughout the design
and are composed into a final solution.  Programming in F# naturally forms
small succinct functions which should have a single purpose, so the single
responsibility rule holds strong here.</p>

<h2>Open closed principle</h2>

<p>The notion that “software entities should be open for extension, but closed
for modification”</p>

<p>This comes down to building abstractions via inheritance, and behavior changes
through polymorphism.  Early on a decision must be made on which parts will
change, and which will be fixed.   The open closed principal is geared towards
languages where inheritance is a core concept, inheritance and polymorphism
are not strongly used in F#, so this principle is very weak here.  Composition
and Type augmentation are the core methods for extension in F#.</p>

<h2>Liskov substitution principle</h2>

<p>Liskov substitution states “objects in a program should be replaceable with
instances of their subtypes without altering the correctness of that program”.</p>

<p>This principle is all about inheritance - derived types preserving the
specification of base types.  Functional languages like F# do not always use
inheritance, it is used quite rarely and only in certain situations.   The
idioms in the language like referential transparency lean strongly towards
enforcing this principle.  Functional languages also have a heritage in
mathematics and algebraic reasoning so referential transparency is key in this
respect.</p>

<h2>Interface segregation principle</h2>

<p>The notion that “many client specific interfaces are better than one general
purpose interface.”</p>

<p>If you are violating single responsibility then your interface will probably
be bloated too with unnecessary properties and methods.  The same rule applies
to F#, keep your interfaces modular and keep indifferent concepts separated.</p>

<h2>Dependency inversion principle</h2>

<p>The notion that one should “Depend upon Abstractions. Do not depend upon
concretions.”</p>

<ol>
<li>High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
<li>Abstractions should not depend upon details. Details should depend upon abstractions.
Dependency inversion is often solved with concepts such as dependency
injection; common techniques for this involves things like constructor
injection and interface injection.  Inversion of control is often solved with
a factory pattern or a service locator.  From a functional point of view,
these containers and injection concepts can be solved with a simple higher
order function, or hole-in-the-middle type pattern which are built right into
the language.</li>
</ol>


<h2>Summary</h2>

<p>So we can assume that in the functional paradigm:</p>

<ul>
<li>Types should have only a single responsibility.</li>
<li>The open closed principle doesn&#8217;t apply in the majority of cases unless we are using an object-oriented approach.  With functional programming we favour functional composition and type augmentation.</li>
<li>The same can be said of the Liskov substitute principle, pure functions uphold this tenant via immutability and referential transparency.</li>
<li>Interface segregation also applies and idiomatic F#  produces small concise functions with modular interfaces with a separation of concerns.</li>
<li>Dependency inversion is not a relevant issue for F# as the language itself supports higher-order-functions to encapsulate this concept.
So only the &#8217;<strong>S</strong>&#8217; and the &#8217;<strong>I</strong>&#8217; parts are relevant in functional
programming.  The other tenants are not fully representative as they stand.
We could probably explore the tenants of good functional design and form a
quirky acronym in the process, but Ill leave that for another time.</li>
</ul>


<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[From C# to F#: A Developer's Perspective]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/07/16/from-c-to-f-a-developers-perspective/"/>
    <updated>2011-07-16T12:08:48+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/07/16/from-c-to-f-a-developers-perspective</id>
    <content type="html"><![CDATA[<p>I recently wrote an article for <a href="http://www.developerfusion.com/">Developer Fusion</a> on the changes in mindset required
when moving from C# to F#.</p>

<p>The article has proved to be more more popular than I envisaged.  I think a lot of .Net developers are interested in F# but are unsure on the path to take
when trying to accomplish this.  For me it was almost a leap of faith, I saw the potential benefits and just jumped right in.<!-- more --></p>

<p>I had to overcome numerous obstacles along the way before I become comfortable within the language.  I had question like:</p>

<ul>
<li>How do design patterns and principles fit in.</li>
<li>How do I structure my applications.</li>
<li>How can I work seamlessly with other libraries in the .Net ecosphere.</li>
</ul>


<p>I will try and answer some of these question over the coming weeks as well as
introducing some new topics.  If anyone has any comments on the article or
suggestions on future content please leave them below, and I will try to work
them into future posts.</p>

<p>You can find the article <a href="http://bit.ly/rdPEq3">here</a>.</p>

<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Agent based scheduling]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/07/03/agent-based-scheduling/"/>
    <updated>2011-07-03T17:28:29+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/07/03/agent-based-scheduling</id>
    <content type="html"><![CDATA[<p>One of the areas that I am very interested in is agents and I have been doing
quite a lot of work in this area lately.</p>

<p>Agents can be used for a multitude of different purposes ranging from:
isolated message passing, object caching, finite state machines, web crawling,
and even reactive user interfaces.  One of the ideas that I have been looking
into lately is agent based scheduling.<!-- more --></p>

<h2>SchedulerAgent</h2>

<p><strong><strong>Listing 1</strong></strong> shows a simple Agent based scheduler:</p>

<figure class='code'><figcaption><span>listing 1  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">module</span> <span class="nc">AgentUtilities</span>
</span><span class='line'>    <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>    <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Threading</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Agent alias for MailboxProcessor</span>
</span><span class='line'>    <span class="k">type</span> <span class="nc">Agent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">T</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nc">MailboxProcessor</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// Two types of Schedule messages that can be sent</span>
</span><span class='line'>    <span class="k">type</span> <span class="nc">ScheduleMessage</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Schedule</span> <span class="k">of</span> <span class="o">(</span><span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">unit</span><span class="o">)</span> <span class="o">*</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">*</span> <span class="nc">TimeSpan</span> <span class="o">*</span> <span class="nc">TimeSpan</span> <span class="o">*</span> <span class="nc">CancellationTokenSource</span> <span class="nc">AsyncReplyChannel</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">ScheduleOnce</span> <span class="k">of</span> <span class="o">(</span><span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">unit</span><span class="o">)</span> <span class="o">*</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">*</span> <span class="nc">TimeSpan</span> <span class="o">*</span> <span class="nc">CancellationTokenSource</span> <span class="nc">AsyncReplyChannel</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// An Agent based scheduler</span>
</span><span class='line'>    <span class="k">type</span> <span class="nc">SchedulerAgent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span><span class="bp">()</span><span class="o">=</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">scheduleOnce</span> <span class="n">delay</span> <span class="n">msg</span> <span class="n">receiver</span> <span class="o">(</span><span class="n">cts</span><span class="o">:</span> <span class="nc">CancellationTokenSource</span><span class="o">)=</span>
</span><span class='line'>        <span class="n">async</span> <span class="o">{</span> <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span><span class="o">(</span><span class="n">delay</span><span class="o">)</span>
</span><span class='line'>            <span class="k">if</span> <span class="o">(</span><span class="n">cts</span><span class="o">.</span><span class="nc">IsCancellationRequested</span><span class="o">)</span>
</span><span class='line'>            <span class="k">then</span> <span class="n">cts</span><span class="o">.</span><span class="nc">Dispose</span><span class="bp">()</span>
</span><span class='line'>            <span class="k">else</span> <span class="n">msg</span> <span class="o">|&gt;</span> <span class="n">receiver</span> <span class="o">}</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">scheduleMany</span> <span class="n">initialDelay</span>  <span class="n">msg</span> <span class="n">receiver</span> <span class="n">delayBetween</span> <span class="n">cts</span><span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span> <span class="n">time</span> <span class="o">(</span><span class="n">cts</span><span class="o">:</span> <span class="nc">CancellationTokenSource</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>           <span class="n">async</span> <span class="o">{</span> <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span><span class="o">(</span><span class="n">time</span><span class="o">)</span>
</span><span class='line'>               <span class="k">if</span> <span class="o">(</span><span class="n">cts</span><span class="o">.</span><span class="nc">IsCancellationRequested</span><span class="o">)</span>
</span><span class='line'>               <span class="k">then</span> <span class="n">cts</span><span class="o">.</span><span class="nc">Dispose</span><span class="bp">()</span>
</span><span class='line'>               <span class="k">else</span> <span class="n">msg</span> <span class="o">|&gt;</span> <span class="n">receiver</span>
</span><span class='line'>               <span class="k">return</span><span class="o">!</span> <span class="n">loop</span> <span class="n">delayBetween</span> <span class="n">cts</span><span class="o">}</span>
</span><span class='line'>        <span class="n">loop</span> <span class="n">initialDelay</span> <span class="n">cts</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">scheduler</span> <span class="o">=</span> <span class="nn">Agent</span><span class="p">.</span><span class="nc">Start</span><span class="o">(</span><span class="k">fun</span> <span class="n">inbox</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span><span class="bp">()</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>          <span class="k">let</span><span class="o">!</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">inbox</span><span class="o">.</span><span class="nc">Receive</span><span class="bp">()</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">cs</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">CancellationTokenSource</span><span class="bp">()</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">msg</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">Schedule</span><span class="o">(</span><span class="n">receiver</span><span class="o">,</span> <span class="n">msg</span><span class="o">:</span><span class="k">&#39;</span><span class="n">a</span><span class="o">,</span> <span class="n">initialDelay</span><span class="o">,</span> <span class="n">delayBetween</span><span class="o">,</span> <span class="n">replyChan</span><span class="o">)</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="nn">Async</span><span class="p">.</span><span class="nc">StartImmediate</span><span class="o">(</span><span class="n">scheduleMany</span>
</span><span class='line'>                         <span class="o">(</span><span class="kt">int</span> <span class="n">initialDelay</span><span class="o">.</span><span class="nc">TotalMilliseconds</span><span class="o">)</span>
</span><span class='line'>                         <span class="n">msg</span>
</span><span class='line'>                         <span class="n">receiver</span>
</span><span class='line'>                         <span class="o">(</span><span class="kt">int</span> <span class="n">delayBetween</span><span class="o">.</span><span class="nc">TotalMilliseconds</span><span class="o">)</span>
</span><span class='line'>                         <span class="n">cs</span> <span class="o">)</span>
</span><span class='line'>            <span class="n">replyChan</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="n">cs</span><span class="o">)</span>
</span><span class='line'>            <span class="k">return</span><span class="o">!</span> <span class="n">loop</span><span class="bp">()</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">ScheduleOnce</span><span class="o">(</span><span class="n">receiver</span><span class="o">,</span> <span class="n">msg</span><span class="o">:</span><span class="k">&#39;</span><span class="n">a</span><span class="o">,</span> <span class="n">delay</span><span class="o">,</span> <span class="n">replyChan</span><span class="o">)</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="nn">Async</span><span class="p">.</span><span class="nc">StartImmediate</span><span class="o">(</span><span class="n">scheduleOnce</span>
</span><span class='line'>                         <span class="o">(</span><span class="kt">int</span> <span class="n">delay</span><span class="o">.</span><span class="nc">TotalMilliseconds</span><span class="o">)</span>
</span><span class='line'>                         <span class="n">msg</span>
</span><span class='line'>                         <span class="n">receiver</span>
</span><span class='line'>                         <span class="n">cs</span><span class="o">)</span>
</span><span class='line'>            <span class="n">replyChan</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="n">cs</span><span class="o">)</span>
</span><span class='line'>            <span class="k">return</span><span class="o">!</span> <span class="n">loop</span><span class="bp">()</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>        <span class="n">loop</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>      <span class="c1">///Schedules a message to be sent to the receiver after the initialDelay.</span>
</span><span class='line'>      <span class="c1">///  If delaybetween is specified then the message is sent reoccuringly at the delaybetween interval.</span>
</span><span class='line'>      <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Schedule</span><span class="o">(</span><span class="n">receiver</span><span class="o">,</span> <span class="n">msg</span><span class="o">,</span> <span class="n">initialDelay</span><span class="o">,</span> <span class="o">?</span><span class="n">delayBetween</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">buildMessage</span> <span class="n">replyChan</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">delayBetween</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">Some</span><span class="o">(</span><span class="n">x</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="nc">Schedule</span><span class="o">(</span><span class="n">receiver</span><span class="o">,</span><span class="n">msg</span><span class="o">,</span><span class="n">initialDelay</span><span class="o">,</span> <span class="n">x</span><span class="o">,</span> <span class="n">replyChan</span><span class="o">)</span>
</span><span class='line'>          <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="nc">ScheduleOnce</span><span class="o">(</span><span class="n">receiver</span><span class="o">,</span><span class="n">msg</span><span class="o">,</span><span class="n">initialDelay</span><span class="o">,</span> <span class="n">replyChan</span><span class="o">)</span>
</span><span class='line'>        <span class="n">scheduler</span><span class="o">.</span><span class="nc">PostAndReply</span> <span class="o">(</span><span class="k">fun</span> <span class="n">replyChan</span> <span class="o">-&gt;</span> <span class="n">replyChan</span> <span class="o">|&gt;</span> <span class="n">buildMessage</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The structure of the SchedulerAgent broken down into sections below:</p>

<h3>ScheduleMessage</h3>

<p>Lines <strong>9-11</strong> show the definition of ScheduleMessage.  This is a discriminated
union of two different types of Schedule message.</p>

<h4>ScheduleOnce</h4>

<p>ScheduleOnce has four parameters:</p>

<ol>
<li>A function which is called at the schedule time (&#8216;a -> unit).</li>
<li>The message that is sent at the schedules time (&#8216;a).</li>
<li>A TimeSpan which is the length of time to wait before triggering the schedule.</li>
<li>An AsyncReplyChannel<CancellationTokenSource>(CancellationTokenSource AsyncReplyChannel).  This is used to return a CancellationTokenSource which can be used to cancel the Schedule.</li>
</ol>


<h4>Schedule</h4>

<p>Schedule has five parameters which are as follows:</p>

<ol>
<li>A function which is called at the schedule time (&#8216;a -> unit).</li>
<li>The message that is sent at the schedules time (&#8216;a).</li>
<li>A TimeSpan which is the initial length of time to wait before first triggering the schedule function.</li>
<li>A TimeSpan which is used as an interval between each subsequent triggering of the schedule function.</li>
<li>An AsyncReplyChannel<CancellationTokenSource>(CancellationTokenSource AsyncReplyChannel).  This is used to return a CancellationTokenSource which can be used to cancel the Schedule.</li>
</ol>


<h2>SchedulerAgent</h2>

<h3>scheduleOnce</h3>

<p>Lines <strong>16-20</strong> define an async workflow, which asynchronously sleeps for the specified time before checking that the schedule hasn&#8217;t been cancelled before finally calling the schedule function.</p>

<h3>scheduleMany</h3>

<p>Lines <strong>22-29</strong> define a recursive async workflow, which asynchronously sleeps for the specified interval (<em>3rd Parameter</em>) before checking the schedule hasn&#8217;t been cancelled before finally calling the schedule function. The <strong>loop</strong> function is then called passing in the second TimeSpan interval <em>(4th Parameter)</em>.</p>

<h3>scheduler</h3>

<p>This is the main processing loop for the agent.  A recursive <strong>loop</strong> function
is declared on line <strong>32</strong>.  On line <strong>33</strong> the agent waits for a message
to arrive.  Once a message arrives a <strong>CancellationTokenSource</strong> is created on
line <strong>36</strong> which can be used to cancel an already scheduled message.
Pattern matching is used on line <strong>35</strong> to find the type of message that has
been received.  The first pattern matching block on lines <strong>36-43</strong> matches
the <strong>Schedule</strong> message.  The parameters from the Schedule message are passed
into the <strong>scheduleMany</strong> function.  This is then invoked asynchronously via
the <strong>Async.StartImmediate</strong> function.  The CancellationTokenSource is now
returned to the caller on line <strong>43</strong>. This allows the caller to cancel an
already running schedule.   Finally the recursive <strong>loop</strong> function is called
on line <strong>44</strong>.  The second pattern matching block on lines <strong>45-52</strong> is much
the same passing the parameters from the <strong>ScheduleOnce</strong> message into the
<strong>scheduleOnce</strong> function, again this is invoked via the
<strong>Async.StartImmediate</strong> function.  Like the Schedule message the
CancellationTokenSource returned on line <strong>51</strong> and the recursive <strong>loop</strong>
function is called on line <strong>52</strong>.</p>

<p>The agent is then started on line <strong>51</strong> by calling the <strong>loop</strong> function for the first time.</p>

<h3>Members</h3>

<p>The SchedulerAgent has only a single member <strong>Schedule</strong>.  This member
function takes three parameters and an optional parameter <strong>delayBetween</strong>.  A
function called <strong>buildMessage</strong> on line <strong>59</strong> uses the optional parameter
with pattern matching to determine whether a <strong>ScheduleOnce</strong> or a
<strong>Schedule</strong> message is created.  The agent is posted the correct message type
on line <strong>63</strong> using the synchronous call scheduler.PostAndReply.  We use a
synchronous call to return the cancellationTokenSource immediately, and this
can be used to cancel a running schedule.</p>

<h2>Sample Application</h2>

<p><strong>Listing 2</strong> shows a test harness that creates and uses a simple string based message scheduler.</p>

<figure class='code'><figcaption><span>Listing 2  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">open</span> <span class="nc">AgentUtilities</span>
</span><span class='line'>    <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>    <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Threading</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">scheduler</span> <span class="o">=</span> <span class="nc">SchedulerAgent</span><span class="o">&lt;_&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">printer</span> <span class="n">message</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">printfn</span> <span class="s2">&quot;%s: %s&quot;</span> <span class="o">(</span><span class="nn">DateTime</span><span class="p">.</span><span class="nn">Now</span><span class="p">.</span><span class="nn">TimeOfDay</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span><span class="o">)</span> <span class="n">message</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">singlecancel</span> <span class="o">=</span> <span class="n">scheduler</span><span class="o">.</span><span class="nc">Schedule</span><span class="o">(</span><span class="n">printer</span><span class="o">,</span>
</span><span class='line'>                        <span class="s2">&quot;Hello from the scheduler&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nc">TimeSpan</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">5</span><span class="o">))</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">multicancel</span> <span class="o">=</span> <span class="n">scheduler</span><span class="o">.</span><span class="nc">Schedule</span><span class="o">(</span> <span class="n">printer</span><span class="o">,</span>
</span><span class='line'>                        <span class="s2">&quot;Hello from the multi scheduler&quot;</span><span class="o">,</span>
</span><span class='line'>                        <span class="nc">TimeSpan</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">5</span><span class="o">),</span>
</span><span class='line'>                        <span class="nc">TimeSpan</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">500</span><span class="o">))</span>
</span><span class='line'>    <span class="n">printfn</span> <span class="s2">&quot;Press any key to cancel.&quot;</span>
</span><span class='line'>    <span class="nn">Console</span><span class="p">.</span><span class="nc">ReadKey</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span><span class='line'>    <span class="c1">//Cancel the multi scheduler</span>
</span><span class='line'>    <span class="n">multicancel</span><span class="o">.</span><span class="nc">Cancel</span><span class="bp">()</span>
</span><span class='line'>    <span class="n">printfn</span> <span class="s2">&quot;Cancelled, press any key to exit.&quot;</span>
</span><span class='line'>    <span class="nn">Console</span><span class="p">.</span><span class="nc">ReadKey</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span></code></pre></td></tr></table></div></figure>


<p>I hope this gives you a feel for what you can do with agent based scheduling.
The library here could be expanded further in several ways.  You could replace
the fixed message with a message generator function or even an agent based
message generator.  If the schedule function was abstracted somewhat it could
be made to accept an agent as the receiver.</p>

<p>One of the key areas I am looking at is building a distributed agent library
that would allow an agent to communicate over network layers transparently.  A
scheduler agent would be even more powerful in this environment.  I could
envisage them used for a many different things in this environment:  heart
beat messages, performance sampling, diagnostics and testing.</p>

<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ Agents and ObjectPools]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/06/05/agents-and-objectpools/"/>
    <updated>2011-06-05T16:13:57+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/06/05/agents-and-objectpools</id>
    <content type="html"><![CDATA[<p>Everyone knows F# agents are cool right?  Well here&#8217;s yet another example of how versatile they can be&#8230;</p>

<p>There was a series of posts last April by Stephen Toub from the <a href="http://blogs.msdn.com/b/pfxteam/">pfxteam</a> at Microsoft.  I was reading
through some of the posts again the other day and thought some of the ideas presented there would make interesting projects in F# to demonstrate the
flexibility and succinctness of the language.  I thought the <a href="http://blogs.msdn.com/b/pfxteam/archive/2010/04/13/9990427.aspx">ObjectPool</a>
example would make an interesting project in F# using agents aka MailboxProcessors.  An ObjectPool is basically a pool of objects that have been
pre-created so that you can grab one and use it, and then place it back in the pool when you&#8217;re finished.  They are useful in situations where the cost of
creating object from scratch is very high or you want to cut down on allocations in the garbage collector.<!-- more --></p>

<p>First of all heres the C# code as it was presented in the Parallel Extensions download:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Diagnostics</span><span class="p">;</span>
</span><span class='line'><span class="k">namespace</span> <span class="nn">System.Collections.Concurrent</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="c1">/// &lt;summary&gt;Provides a thread-safe object pool.&lt;/summary&gt;</span>
</span><span class='line'>  <span class="c1">/// &lt;typeparam name=&quot;T&quot;&gt;Specifies the type of the elements stored in the pool.&lt;/typeparam&gt;</span>
</span><span class='line'><span class="na">  [DebuggerDisplay(&quot;Count={Count}&quot;)]</span>
</span><span class='line'><span class="na">  [DebuggerTypeProxy(typeof(IProducerConsumerCollection_DebugView&lt;&gt;))]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">sealed</span> <span class="k">class</span> <span class="nc">ObjectPool</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="p">:</span> <span class="n">ProducerConsumerCollectionBase</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="k">readonly</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">_generator</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;Initializes an instance of the ObjectPool class.&lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;generator&quot;&gt;The function used to create items when no items exist in the pool.&lt;/param&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">ObjectPool</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">generator</span><span class="p">)</span> <span class="p">:</span> <span class="k">this</span><span class="p">(</span><span class="n">generator</span><span class="p">,</span> <span class="k">new</span> <span class="n">ConcurrentQueue</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;())</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;Initializes an instance of the ObjectPool class.&lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;generator&quot;&gt;The function used to create items when no items exist in the pool.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;collection&quot;&gt;The collection used to store the elements of the pool.&lt;/param&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">ObjectPool</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">generator</span><span class="p">,</span> <span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">collection</span><span class="p">)</span>
</span><span class='line'>      <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">collection</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">generator</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;generator&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="n">_generator</span> <span class="p">=</span> <span class="n">generator</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;Adds the provided item into the pool.&lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;item&quot;&gt;The item to be added.&lt;/param&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">PutObject</span><span class="p">(</span><span class="n">T</span> <span class="n">item</span><span class="p">)</span> <span class="p">{</span> <span class="k">base</span><span class="p">.</span><span class="n">TryAdd</span><span class="p">(</span><span class="n">item</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;Gets an item from the pool.&lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;returns&gt;The removed or created item.&lt;/returns&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;remarks&gt;If the pool is empty, a new item will be created and returned.&lt;/remarks&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">T</span> <span class="nf">GetObject</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">T</span> <span class="k">value</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">base</span><span class="p">.</span><span class="n">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="k">value</span><span class="p">)</span> <span class="p">?</span> <span class="k">value</span> <span class="p">:</span> <span class="n">_generator</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;Clears the object pool, returning all of the data that was in the pool.&lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;returns&gt;An array containing all of the elements in the pool.&lt;/returns&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">T</span><span class="p">[]</span> <span class="nf">ToArrayAndClear</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">var</span> <span class="n">items</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;();</span>
</span><span class='line'>      <span class="n">T</span> <span class="k">value</span><span class="p">;</span>
</span><span class='line'>      <span class="k">while</span> <span class="p">(</span><span class="k">base</span><span class="p">.</span><span class="n">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="k">value</span><span class="p">))</span> <span class="n">items</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">value</span><span class="p">);</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">items</span><span class="p">.</span><span class="n">ToArray</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">protected</span> <span class="k">override</span> <span class="kt">bool</span> <span class="nf">TryAdd</span><span class="p">(</span><span class="n">T</span> <span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">PutObject</span><span class="p">(</span><span class="n">item</span><span class="p">);</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">protected</span> <span class="k">override</span> <span class="kt">bool</span> <span class="nf">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="n">T</span> <span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">item</span> <span class="p">=</span> <span class="n">GetObject</span><span class="p">();</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>There&#8217;s also a base class which looks like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'><span class="c1">/// Provides a base implementation for producer-consumer collections that wrap other</span>
</span><span class='line'><span class="c1">/// producer-consumer collections.</span>
</span><span class='line'><span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;typeparam name=&quot;T&quot;&gt;Specifies the type of elements in the collection.&lt;/typeparam&gt;</span>
</span><span class='line'><span class="na">[Serializable]</span>
</span><span class='line'><span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">ProducerConsumerCollectionBase</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="p">:</span> <span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="k">private</span> <span class="k">readonly</span> <span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">_contained</span><span class="p">;</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Initializes the ProducerConsumerCollectionBase instance.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;contained&quot;&gt;The collection to be wrapped by this instance.&lt;/param&gt;</span>
</span><span class='line'><span class="k">protected</span> <span class="nf">ProducerConsumerCollectionBase</span><span class="p">(</span><span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">contained</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">contained</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;contained&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">_contained</span> <span class="p">=</span> <span class="n">contained</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Gets the contained collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="k">protected</span> <span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">ContainedCollection</span> <span class="p">{</span> <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Attempts to add the specified value to the end of the deque.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;item&quot;&gt;The item to add.&lt;/param&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;true if the item could be added; otherwise, false.&lt;/returns&gt;</span>
</span><span class='line'><span class="k">protected</span> <span class="k">virtual</span> <span class="kt">bool</span> <span class="nf">TryAdd</span><span class="p">(</span><span class="n">T</span> <span class="n">item</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">TryAdd</span><span class="p">(</span><span class="n">item</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Attempts to remove and return an item from the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;item&quot;&gt;</span>
</span><span class='line'><span class="c1">/// When this method returns, if the operation was successful, item contains the item removed. If</span>
</span><span class='line'><span class="c1">/// no item was available to be removed, the value is unspecified.</span>
</span><span class='line'><span class="c1">/// &lt;/param&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;</span>
</span><span class='line'><span class="c1">/// true if an element was removed and returned from the collection; otherwise, false.</span>
</span><span class='line'><span class="c1">/// &lt;/returns&gt;</span>
</span><span class='line'><span class="k">protected</span> <span class="k">virtual</span> <span class="kt">bool</span> <span class="nf">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="n">T</span> <span class="n">item</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="n">item</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Attempts to add the specified value to the end of the deque.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;item&quot;&gt;The item to add.&lt;/param&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;true if the item could be added; otherwise, false.&lt;/returns&gt;</span>
</span><span class='line'><span class="kt">bool</span> <span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;.</span><span class="n">TryAdd</span><span class="p">(</span><span class="n">T</span> <span class="n">item</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">TryAdd</span><span class="p">(</span><span class="n">item</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Attempts to remove and return an item from the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;item&quot;&gt;</span>
</span><span class='line'><span class="c1">/// When this method returns, if the operation was successful, item contains the item removed. If</span>
</span><span class='line'><span class="c1">/// no item was available to be removed, the value is unspecified.</span>
</span><span class='line'><span class="c1">/// &lt;/param&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;</span>
</span><span class='line'><span class="c1">/// true if an element was removed and returned from the collection; otherwise, false.</span>
</span><span class='line'><span class="c1">/// &lt;/returns&gt;</span>
</span><span class='line'><span class="kt">bool</span> <span class="n">IProducerConsumerCollection</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;.</span><span class="n">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="n">T</span> <span class="n">item</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">TryTake</span><span class="p">(</span><span class="k">out</span> <span class="n">item</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Gets the number of elements contained in the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="k">public</span> <span class="kt">int</span> <span class="n">Count</span> <span class="p">{</span> <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">Count</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Creates an array containing the contents of the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;The array.&lt;/returns&gt;</span>
</span><span class='line'><span class="k">public</span> <span class="n">T</span><span class="p">[]</span> <span class="nf">ToArray</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">ToArray</span><span class="p">();</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Copies the contents of the collection to an array.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;array&quot;&gt;The array to which the data should be copied.&lt;/param&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;index&quot;&gt;The starting index at which data should be copied.&lt;/param&gt;</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">CopyTo</span><span class="p">(</span><span class="n">T</span><span class="p">[]</span> <span class="n">array</span><span class="p">,</span> <span class="kt">int</span> <span class="n">index</span><span class="p">)</span> <span class="p">{</span> <span class="n">_contained</span><span class="p">.</span><span class="n">CopyTo</span><span class="p">(</span><span class="n">array</span><span class="p">,</span> <span class="n">index</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Copies the contents of the collection to an array.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;array&quot;&gt;The array to which the data should be copied.&lt;/param&gt;</span>
</span><span class='line'><span class="c1">/// &lt;param name=&quot;index&quot;&gt;The starting index at which data should be copied.&lt;/param&gt;</span>
</span><span class='line'><span class="k">void</span> <span class="n">ICollection</span><span class="p">.</span><span class="n">CopyTo</span><span class="p">(</span><span class="n">Array</span> <span class="n">array</span><span class="p">,</span> <span class="kt">int</span> <span class="n">index</span><span class="p">)</span> <span class="p">{</span> <span class="n">_contained</span><span class="p">.</span><span class="n">CopyTo</span><span class="p">(</span><span class="n">array</span><span class="p">,</span> <span class="n">index</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Gets an enumerator for the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;An enumerator.&lt;/returns&gt;</span>
</span><span class='line'><span class="k">public</span> <span class="n">IEnumerator</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">GetEnumerator</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">GetEnumerator</span><span class="p">();</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Gets an enumerator for the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;returns&gt;An enumerator.&lt;/returns&gt;</span>
</span><span class='line'><span class="n">IEnumerator</span> <span class="n">IEnumerable</span><span class="p">.</span><span class="n">GetEnumerator</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">GetEnumerator</span><span class="p">();</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Gets whether the collection is synchronized.&lt;/summary&gt;</span>
</span><span class='line'><span class="kt">bool</span> <span class="n">ICollection</span><span class="p">.</span><span class="n">IsSynchronized</span> <span class="p">{</span> <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">IsSynchronized</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'><span class="c1">/// &lt;summary&gt;Gets the synchronization root object for the collection.&lt;/summary&gt;</span>
</span><span class='line'><span class="kt">object</span> <span class="n">ICollection</span><span class="p">.</span><span class="n">SyncRoot</span> <span class="p">{</span> <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_contained</span><span class="p">.</span><span class="n">SyncRoot</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Wow!</strong>  Thats a fair bit of code in C#, fair enough there is a lot of noise in the xml doc comments, but theres also a lot of boiler plate code in there too.</p>

<p>Ok now we have gotten that out of the way heres the good bit.  </p>

<p>Below is an agent based design which implements the same functionality but uses a lot less code.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="nc">Poc</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Agent alias for MailboxProcessor</span>
</span><span class='line'><span class="k">type</span> <span class="nc">Agent</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">T</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nc">MailboxProcessor</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="nc">T</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">///One of three messages for our Object Pool agent</span>
</span><span class='line'><span class="k">type</span> <span class="nc">PoolMessage</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span>
</span><span class='line'>  <span class="o">|</span> <span class="nc">Get</span> <span class="k">of</span> <span class="nc">AsyncReplyChannel</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">|</span> <span class="nc">Put</span> <span class="k">of</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">*</span> <span class="nc">AsyncReplyChannel</span><span class="o">&lt;</span><span class="kt">unit</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">|</span> <span class="nc">Clear</span> <span class="k">of</span> <span class="nc">AsyncReplyChannel</span><span class="o">&lt;</span><span class="nc">List</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">/// Object pool representing a reusable pool of objects</span>
</span><span class='line'><span class="k">type</span> <span class="nc">ObjectPool</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;(</span><span class="n">generate</span><span class="o">:</span> <span class="kt">unit</span> <span class="o">-&gt;</span> <span class="k">&#39;</span><span class="n">a</span><span class="o">,</span> <span class="n">initialPoolCount</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">initial</span> <span class="o">=</span> <span class="nn">List</span><span class="p">.</span><span class="n">init</span> <span class="n">initialPoolCount</span> <span class="o">(</span><span class="k">fun</span> <span class="o">(</span><span class="n">x</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="n">generate</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">agent</span> <span class="o">=</span> <span class="nn">Agent</span><span class="p">.</span><span class="nc">Start</span><span class="o">(</span><span class="k">fun</span> <span class="n">inbox</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span><span class="o">(</span><span class="n">x</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">let</span><span class="o">!</span> <span class="n">msg</span> <span class="o">=</span> <span class="n">inbox</span><span class="o">.</span><span class="nc">Receive</span><span class="bp">()</span>
</span><span class='line'>      <span class="k">match</span> <span class="n">msg</span> <span class="k">with</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Get</span><span class="o">(</span><span class="n">reply</span><span class="o">)</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">res</span> <span class="o">=</span> <span class="k">match</span> <span class="n">x</span> <span class="k">with</span>
</span><span class='line'>              <span class="o">|</span> <span class="n">a</span> <span class="o">::</span> <span class="n">b</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="n">reply</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="n">a</span><span class="o">);</span><span class="n">b</span>
</span><span class='line'>              <span class="o">|</span> <span class="bp">[]</span> <span class="k">as</span> <span class="n">empty</span><span class="o">-&gt;</span>
</span><span class='line'>                <span class="n">reply</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="n">generate</span><span class="bp">()</span><span class="o">);</span><span class="n">empty</span>
</span><span class='line'>        <span class="k">return</span><span class="o">!</span> <span class="n">loop</span><span class="o">(</span><span class="n">res</span><span class="o">)</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Put</span><span class="o">(</span><span class="n">value</span><span class="o">,</span> <span class="n">reply</span><span class="o">)-&gt;</span>
</span><span class='line'>        <span class="n">reply</span><span class="o">.</span><span class="nc">Reply</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">return</span><span class="o">!</span> <span class="n">loop</span><span class="o">(</span><span class="n">value</span> <span class="o">::</span> <span class="n">x</span><span class="o">)</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Clear</span><span class="o">(</span><span class="n">reply</span><span class="o">)</span> <span class="o">-&gt;</span>
</span><span class='line'>        <span class="n">reply</span><span class="o">.</span><span class="nc">Reply</span><span class="o">(</span><span class="n">x</span><span class="o">)</span>
</span><span class='line'>        <span class="k">return</span><span class="o">!</span> <span class="n">loop</span><span class="o">(</span><span class="nn">List</span><span class="p">.</span><span class="n">empty</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">)</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>    <span class="n">loop</span><span class="o">(</span><span class="n">initial</span><span class="o">))</span>
</span><span class='line'>  <span class="c1">/// Clears the object pool, returning all of the data that was in the pool.</span>
</span><span class='line'>  <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">ToListAndClear</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>    <span class="n">agent</span><span class="o">.</span><span class="nc">PostAndAsyncReply</span><span class="o">(</span><span class="nc">Clear</span><span class="o">)</span>
</span><span class='line'>  <span class="c1">/// Puts an item into the pool</span>
</span><span class='line'>  <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Put</span><span class="o">(</span><span class="n">item</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="n">agent</span><span class="o">.</span><span class="nc">PostAndAsyncReply</span><span class="o">((</span><span class="k">fun</span> <span class="n">ch</span> <span class="o">-&gt;</span> <span class="nc">Put</span><span class="o">(</span><span class="n">item</span><span class="o">,</span> <span class="n">ch</span><span class="o">)))</span>
</span><span class='line'>  <span class="c1">/// Gets an item from the pool or if there are none present use the generator</span>
</span><span class='line'>  <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Get</span><span class="o">(</span><span class="n">item</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="n">agent</span><span class="o">.</span><span class="nc">PostAndAsyncReply</span><span class="o">(</span><span class="nc">Get</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We have a discriminated union (PoolMessage) which describes the messages that we are going to use with this agent, they are pretty straight forward to follow.  </p>

<ul>
<li><strong>Get</strong> simply returns either a stored item or generates a brand new one using the generator function which is passed into the ObjectPools constructor <strong>(generate: unit -> &#8216;a)</strong>.  </li>
<li><strong>Put</strong> simply adds the item onto the internal list.</li>
<li><strong>Clear</strong> simply returns the current pool and then clears it.</li>
</ul>


<p>The core processing all happens in the <strong>async{}</strong> block, we simply wait for a message to arrive, then we pattern match on one of the messages either Get,Put, or Clear.</p>

<p><strong>Get</strong> takes an item from the internal list if there are items present, otherwise it invokes the generator function and returns a newly generated object.</p>

<p>For a <strong>Put</strong> operation we use the cons <strong>(::)</strong> operator to add the item onto the internal list via the recursive loop.</p>

<p>For the <strong>Clear</strong> operation we return the entire list then return an empty list to the recursive loop.</p>

<p>I think you will agree this is a nice succinct example of the flexibility and elegance of agents and yet another reason to use F# for more server side
activities.  It&#8217;s not simply a language for the mathematical and finance orientated developers.</p>

<p>For anyone interested all of the code should be in my <a href="http://bit.ly/mDQyfH">GitHub repository </a>to download.</p>

<p>Thanks to <a href="http://tomasp.net/">Tomas Petricek</a> for suggesting using the recursive loop to pass the list rather than using a ref cell and the (<strong>:=</strong>) operator.</p>

<p>Until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New projects]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/05/04/new-projects/"/>
    <updated>2011-05-04T02:18:41+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/05/04/new-projects</id>
    <content type="html"><![CDATA[<p>Hello again, since my initial articles on Sockets and pipelines.  I have had quite a bit of interest and I am now pleased to say that these projects have
all grown up and now have a proper home on <a href="https://github.com/">GitHub</a>.</p>

<p>The Sockets and Bockets articles have become <a href="https://github.com/7sharp9/flack">Flack</a> and the pipeline articles have
become <a href="https://github.com/7sharp9/pipelets">Pipelets</a>.  Flack is named so because I always like to use quirky names for libraries and its original name
was a bit controversial, hence Flack i.e. I get a lot of flack about my naming :-) <!-- more --></p>

<p>I have been working on consolidating and expanding the demo code to produce some useful libraries rather than just proof of concepts and demo&#8217;s.  I was
contacted pretty early on by Ryan Riley who has been working on <a href="https://github.com/panesofglass/frack">Frack</a>, for those of you who dont know
Frack is an F# implementation based on Rack:</p>

<blockquote><p>Rack provides a minimal, modular and adaptable interface for developing</p>

<pre><code>web applications in Ruby.  By wrapping HTTP requests and responses in
the simplest way possible, it unifies and distills the API for web
servers, web frameworks, and software in between (the so-called
middleware) into a single method call.
</code></pre></blockquote>

<p>Ryan wanted to see if the SocketAsyncEventArgs pattern could be used in Frack to improve efficiency.  So far I have been pushed for time to make a large
amount of progress on integrating the two, but things are progressing faster now that the library is on <a href="https://github.com/">GitHub</a>.</p>

<p>Please check out:</p>

<ul>
<li><a href="https://github.com/7sharp9/flack">Flack</a></li>
<li><a href="https://github.com/7sharp9/pipelets">Pipelets</a></li>
<li><a href="https://github.com/panesofglass/frack">Frack</a></li>
</ul>


<p>Also check out Ryan&#8217;s technical blog: <a href="http://wizardsofsmart.net/">Wizards of Smart</a></p>

<p>The other thing in the pipeline, pun intended, is a distributed pipeline engine where a pipeline would be exposed via a socket and could be connected
to other pipeline systems.  The beauty of a system like this is you could compose systems of pipelines to run either on either a single machine or
distributed over a network, this would effectively marry together functional composition and distributed systems.  Its early days yet but I hope to get
together some more details of how this will work in the coming weeks, Im quite excited to get working on it!</p>

<p>As always I appreciate any comments or suggestions.</p>

<p>See you soon.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pipeline processing 3]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/04/04/pipeline-processing-3/"/>
    <updated>2011-04-04T21:56:33+01:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/04/04/pipeline-processing-3</id>
    <content type="html"><![CDATA[<p>Ok so I have been offline for a while now, what with starting a new financial contract in London and not having any broadband access for a while.  I have
been working on something, honest!</p>

<p>Since the last post I have been reflecting on the pipeline design and it had a distinct object orientated feel to it that I wasnt happy with, so I have
amended the structure of the code and come up with the following which simplifies in some areas and expands in others&#8230;<!-- more --></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="nc">Pipeline</span>
</span><span class='line'>  <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Concurrent</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">[&lt;</span><span class="nc">Interface</span><span class="o">&gt;]</span>
</span><span class='line'>  <span class="k">type</span> <span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">abstract</span> <span class="nc">Insert</span><span class="o">:</span> <span class="k">&#39;</span><span class="n">a</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">[&lt;</span><span class="nc">Interface</span><span class="o">&gt;]</span>
</span><span class='line'>  <span class="k">type</span> <span class="nc">IPipelineConnection</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">abstract</span> <span class="nc">Attach</span><span class="o">:</span> <span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class='line'>    <span class="k">abstract</span> <span class="nc">Detach</span><span class="o">:</span> <span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="o">-&gt;</span> <span class="kt">unit</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">[&lt;</span><span class="nc">Interface</span><span class="o">&gt;]</span>
</span><span class='line'>  <span class="k">type</span> <span class="nc">IPipeline</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">,</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">inherit</span> <span class="nc">IPipelineConnection</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="k">inherit</span> <span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">type</span> <span class="nc">PipelineStage</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">,</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;(</span><span class="n">processor</span><span class="o">,</span> <span class="n">router</span><span class="o">:</span> <span class="n">seq</span><span class="o">&lt;</span><span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;&gt;</span> <span class="o">*</span> <span class="k">&#39;</span><span class="n">b</span> <span class="o">-&gt;</span> <span class="n">seq</span><span class="o">&lt;</span><span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;&gt;,</span> <span class="o">?</span><span class="n">overflow</span><span class="o">,</span> <span class="o">?</span><span class="n">capacity</span><span class="o">,</span> <span class="o">?</span><span class="n">blockingTime</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">processor</span> <span class="o">=</span> <span class="n">processor</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">router</span> <span class="o">=</span> <span class="n">router</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">createBlockingCollection</span> <span class="n">x</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">x</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span> <span class="nc">Some</span> <span class="n">c</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nc">BlockingCollection</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;(</span><span class="n">c</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span>
</span><span class='line'>        <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span> <span class="k">new</span> <span class="nc">BlockingCollection</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">buffer</span> <span class="o">=</span> <span class="n">createBlockingCollection</span> <span class="n">capacity</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">routes</span> <span class="o">=</span> <span class="n">ref</span> <span class="nn">List</span><span class="p">.</span><span class="n">empty</span><span class="o">&lt;</span><span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;&gt;</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">queuedOrRunning</span> <span class="o">=</span> <span class="n">ref</span> <span class="bp">false</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">blocktime</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">match</span> <span class="n">blockingTime</span> <span class="k">with</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">Some</span> <span class="n">b</span> <span class="o">-&gt;</span> <span class="n">b</span>
</span><span class='line'>      <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span> <span class="mi">250</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">consumerLoop</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">try</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span><span class="bp">()</span><span class="o">=</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">item</span> <span class="o">=</span> <span class="n">ref</span> <span class="nn">Unchecked</span><span class="p">.</span><span class="n">defaultof</span><span class="o">&lt;_&gt;</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">taken</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="nc">TryTake</span><span class="o">(</span><span class="n">item</span><span class="o">,</span> <span class="n">blocktime</span><span class="o">)</span>
</span><span class='line'>          <span class="k">if</span> <span class="n">taken</span> <span class="k">then</span>
</span><span class='line'>              <span class="k">do</span> <span class="o">!</span><span class="n">item</span>
</span><span class='line'>              <span class="o">|&gt;</span> <span class="n">processor</span>
</span><span class='line'>              <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">iter</span> <span class="o">(</span><span class="k">fun</span> <span class="n">z</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="o">(</span><span class="k">match</span> <span class="o">!</span><span class="n">routes</span> <span class="k">with</span>
</span><span class='line'>               <span class="o">|</span> <span class="bp">[]</span> <span class="o">-&gt;</span> <span class="bp">()</span><span class="c">(*we cant route with no routes*)</span>
</span><span class='line'>               <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="k">do</span> <span class="n">router</span> <span class="o">(!</span><span class="n">routes</span><span class="o">,</span> <span class="n">z</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">iter</span> <span class="o">(</span><span class="k">fun</span> <span class="n">r</span> <span class="o">-&gt;</span> <span class="o">(</span><span class="n">r</span><span class="o">.</span><span class="nc">Insert</span> <span class="n">z</span> <span class="o">)))</span> <span class="o">)</span>
</span><span class='line'>              <span class="n">loop</span><span class="bp">()</span>
</span><span class='line'>          <span class="k">else</span> <span class="bp">()</span><span class="c">(*exit nothing to consume in time limit*)</span>
</span><span class='line'>        <span class="n">loop</span><span class="bp">()</span>
</span><span class='line'>      <span class="k">with</span> <span class="n">e</span> <span class="o">-&gt;</span> <span class="n">raise</span> <span class="n">e</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">ClearRoutes</span> <span class="o">=</span> <span class="n">routes</span> <span class="o">:=</span> <span class="bp">[]</span>
</span><span class='line'>    <span class="k">interface</span> <span class="nc">IPipelineInput</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">a</span><span class="o">&gt;</span> <span class="k">with</span>
</span><span class='line'>      <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Insert</span> <span class="n">payload</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">added</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="nc">TryAdd</span><span class="o">(</span><span class="n">payload</span><span class="o">,</span> <span class="n">blocktime</span><span class="o">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">added</span> <span class="k">then</span>
</span><span class='line'>          <span class="c1">//begin consumer loop</span>
</span><span class='line'>          <span class="k">if</span> <span class="ow">not</span> <span class="o">!</span><span class="n">queuedOrRunning</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">lock</span> <span class="n">consumerLoop</span> <span class="o">(</span><span class="k">fun</span><span class="bp">()</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span><span class="o">(</span><span class="n">async</span> <span class="o">{</span><span class="k">do</span><span class="o">!</span> <span class="n">consumerLoop</span> <span class="o">})</span>
</span><span class='line'>            <span class="n">queuedOrRunning</span> <span class="o">:=</span> <span class="bp">true</span><span class="o">)</span>
</span><span class='line'>          <span class="k">else</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>          <span class="c1">//overflow here if function passed</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">overflow</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">Some</span> <span class="n">t</span> <span class="o">-&gt;</span>  <span class="n">payload</span> <span class="o">|&gt;</span> <span class="n">overflow</span><span class="o">.</span><span class="nc">Value</span>
</span><span class='line'>          <span class="o">|</span> <span class="nc">None</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span><span class='line'>    <span class="k">interface</span> <span class="nc">IPipelineConnection</span><span class="o">&lt;</span><span class="k">&#39;</span><span class="n">b</span><span class="o">&gt;</span> <span class="k">with</span>
</span><span class='line'>      <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Attach</span> <span class="o">(</span><span class="n">stage</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">current</span> <span class="o">=</span> <span class="o">!</span><span class="n">routes</span>
</span><span class='line'>        <span class="n">routes</span> <span class="o">:=</span> <span class="n">stage</span> <span class="o">::</span> <span class="n">current</span>
</span><span class='line'>      <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Detach</span> <span class="o">(</span><span class="n">stage</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">current</span> <span class="o">=</span> <span class="o">!</span><span class="n">routes</span>
</span><span class='line'>        <span class="n">routes</span> <span class="o">:=</span> <span class="nn">List</span><span class="p">.</span><span class="n">filter</span> <span class="o">(</span><span class="k">fun</span> <span class="n">el</span> <span class="o">-&gt;</span> <span class="n">el</span> <span class="o">&lt;&gt;</span> <span class="n">stage</span><span class="o">)</span> <span class="n">current</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="nc">Attach</span> <span class="o">(</span><span class="n">a</span><span class="o">:</span><span class="nc">IPipelineConnection</span><span class="o">&lt;_&gt;)</span> <span class="o">(</span><span class="n">b</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">a</span><span class="o">.</span><span class="nc">Attach</span> <span class="n">b</span> <span class="o">;</span><span class="n">b</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="nc">Detach</span> <span class="o">(</span><span class="n">a</span><span class="o">:</span> <span class="nc">IPipelineConnection</span><span class="o">&lt;_&gt;)</span> <span class="o">(</span><span class="n">b</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">a</span><span class="o">.</span><span class="nc">Detach</span> <span class="n">b</span> <span class="o">;</span><span class="n">a</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="o">(++&gt;)</span> <span class="o">(</span><span class="n">a</span><span class="o">:</span><span class="nc">IPipelineConnection</span><span class="o">&lt;_&gt;,</span> <span class="n">b</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">a</span><span class="o">.</span><span class="nc">Attach</span> <span class="o">(</span><span class="n">b</span><span class="o">)</span> <span class="o">;</span><span class="n">b</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="o">(--&gt;)</span> <span class="o">(</span><span class="n">a</span><span class="o">:</span><span class="nc">IPipelineConnection</span><span class="o">&lt;_&gt;,</span> <span class="n">b</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">a</span><span class="o">.</span><span class="nc">Detach</span> <span class="n">b</span> <span class="o">;</span><span class="n">a</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="o">(&lt;&lt;--)</span> <span class="o">(</span><span class="n">a</span><span class="o">:</span><span class="nc">IPipelineInput</span><span class="o">&lt;_&gt;,</span> <span class="n">b</span><span class="o">:</span><span class="k">&#39;</span><span class="n">b</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">a</span><span class="o">.</span><span class="nc">Insert</span> <span class="n">b</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">member</span> <span class="o">(--&gt;&gt;)</span> <span class="o">(</span><span class="n">b</span><span class="o">,</span><span class="n">a</span><span class="o">:</span><span class="nc">IPipelineInput</span><span class="o">&lt;_&gt;)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">a</span><span class="o">.</span><span class="nc">Insert</span> <span class="n">b</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Summary.</h3>

<p>I only want to summarise the code as I think its fairly straight forward to
see whats going on.</p>

<h3>Interfaces</h3>

<p>We have two main interfaces defined <strong>IPipelineInput&lt;&#8217;a></strong> and
<strong>IPipelineConnection&lt;&#8217;a>, </strong>as you can tell by the names they are involved
with connecting the pipeline together and getting information into the
pipeline.  Those two interfaces are merged together in the IPipeline&lt;&#8217;a, &#8216;b>
interface, this keeps a nice separation between connecting and inserting into
the pipeline, it also makes implementation easier and allows the interfaces to
be implemented in other areas of code that need to talk to or connect to a
pipeline.</p>

<h3>Internals</h3>

<p>Inside the pipeline we have the bounded blocking queue which is implemented by
the BlockingCollection from TPL. This is used to store the pipeline payloads
that are waiting to be processed.</p>

<p>The consumerLoop function is recursive and continually tries to take items
from the blocking collection processing and routing each one to the next
pipeline stage.</p>

<p>The processor is a function that transforms from type &#8216;a to type &#8216;b.</p>

<p>The router is a function that takes a sequence of IPipelineInput&lt;&#8217;b> and also
the payload &#8216;b it returns a sequence of IPipelineInput&lt;&#8217;b>.  What this
effectively means is that we can route by the connected stages (i.e. round
robin routing, multi-cast routing.)   Or we could route by payload contents
(i.e. if the payload contains a certain bytes sequence we could choose a
certain IPipelineInput&lt;&#8217;b>.)</p>

<p>Each item taken is passed to the processor and router via pipeline (<strong>|></strong>) and
Seq operations, recursively calling itself until an item can no longer be
retrieved from the buffer.</p>

<p>The implementation of IPipelineInput&lt;&#8217;a>.Insert is the counterpart to the
previous function. It first tries to inset the item into the bounded blocking
queue, if this cannot be done then the overflow function is called if one is
present. Next the async consumer loop is started if it is not already running.
The idea behind this is that by keeping the payload processing running on the
thread pool while there is work to do it will cut down on the number of
context switches between threads.  Once an item cannot be taken from the
bounding blocking queue the loop will exit.</p>

<p>The rest of the code is pretty standard stuff and should be pretty easy to
follow.</p>

<p>I also define some symbolic operations to simply constructing and using the
pipeline:</p>

<p><strong>++></strong> Attaches the pipeline stage on the right hand side to the one on the left. <strong>&#8211;></strong> Detaches the pipelinestage on the right from the one on the left. <strong>&lt;&lt;&#8211;</strong> Inserts a payload on the right into the pipeline stage on the left. <strong>&#8211;>></strong> Inserts a payload on the left hand side into the pipeline stage on the right.<br/>
These help to keep a nice terse description of the pipeline, once things get a little more complex other operators may be required, the now discontinued
<a href="http://msdn.microsoft.com/en-us/devlabs/dd795202.aspx">Axiom</a> had a whole host of these, its a pity Microsoft dropped the language.</p>

<h3>Example</h3>

<p>Heres a quick sample pipeline showing the pipeline in use:</p>

<ul>
<li>Stage 1 takes a string and splits it based on the &#8216;,&#8217;.</li>
<li>Stage 2 reverses each string.</li>
<li>Stage 3 reverses the string back to the original.</li>
</ul>


<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="n">program</span>
</span><span class='line'>  <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>  <span class="k">open</span> <span class="nc">Pipeline</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">consoleLock</span> <span class="o">=</span> <span class="k">new</span> <span class="n">obj</span><span class="bp">()</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">split</span> <span class="n">del</span> <span class="n">n</span> <span class="o">(</span><span class="n">s</span><span class="o">:</span><span class="kt">string</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="n">lock</span> <span class="n">consoleLock</span> <span class="o">(</span><span class="k">fun</span><span class="bp">()</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="k">do</span> <span class="n">printfn</span> <span class="s2">&quot;%A:before split %A&quot;</span> <span class="n">n</span> <span class="n">s</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">split</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="nc">Split</span><span class="o">([|</span><span class="n">del</span><span class="o">|])</span>
</span><span class='line'>    <span class="k">do</span> <span class="n">printfn</span> <span class="s2">&quot;%A:after: split into: %A&quot;</span> <span class="n">n</span> <span class="n">split</span>
</span><span class='line'>    <span class="n">split</span> <span class="o">|&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">toSeq</span><span class="o">)</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">reverse</span> <span class="o">(</span><span class="n">s</span><span class="o">:</span><span class="kt">string</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">new</span> <span class="kt">string</span><span class="o">(</span><span class="n">s</span> <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">toArray</span> <span class="o">|&gt;</span> <span class="nn">Array</span><span class="p">.</span><span class="n">rev</span><span class="o">)</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">oneToSingleton</span> <span class="n">a</span> <span class="n">b</span> <span class="n">f</span><span class="o">=</span>
</span><span class='line'>    <span class="n">lock</span> <span class="n">consoleLock</span> <span class="o">(</span><span class="k">fun</span><span class="bp">()</span> <span class="o">-&gt;</span>
</span><span class='line'>      <span class="n">printfn</span> <span class="s2">&quot;%A:before reverse %A&quot;</span> <span class="n">a</span> <span class="n">b</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">b</span> <span class="o">|&gt;</span> <span class="n">f</span>
</span><span class='line'>      <span class="n">printfn</span> <span class="s2">&quot;%A:after reverse %A&quot;</span> <span class="n">a</span> <span class="n">result</span>
</span><span class='line'>      <span class="n">result</span><span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">singleton</span><span class="o">)</span>
</span><span class='line'>  <span class="k">let</span> <span class="nc">OneToSeqRev</span> <span class="n">a</span> <span class="n">b</span> <span class="o">=</span> <span class="n">oneToSingleton</span> <span class="n">a</span> <span class="n">b</span> <span class="n">reverse</span>
</span><span class='line'>  <span class="c1">///Simply picks the first route</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">basicRouter</span><span class="o">(</span> <span class="n">r</span><span class="o">,</span> <span class="n">i</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">head</span> <span class="o">=</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">head</span> <span class="n">r</span>
</span><span class='line'>    <span class="nn">Seq</span><span class="p">.</span><span class="n">singleton</span> <span class="n">head</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">p1</span> <span class="o">=</span> <span class="nc">PipelineStage</span><span class="o">(</span> <span class="n">split</span> <span class="sc">&#39;,&#39;</span> <span class="s2">&quot;1&quot;</span><span class="o">,</span> <span class="n">basicRouter</span><span class="o">)</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">p2</span> <span class="o">=</span> <span class="nc">PipelineStage</span><span class="o">(</span> <span class="nc">OneToSeqRev</span> <span class="s2">&quot;2&quot;</span><span class="o">,</span> <span class="n">basicRouter</span><span class="o">)</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">p3</span> <span class="o">=</span> <span class="nc">PipelineStage</span><span class="o">(</span> <span class="nc">OneToSeqRev</span> <span class="s2">&quot;3&quot;</span><span class="o">,</span> <span class="n">basicRouter</span><span class="o">)</span>
</span><span class='line'>  <span class="n">p1</span> <span class="o">++&gt;</span> <span class="n">p2</span> <span class="o">++&gt;</span> <span class="n">p3</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">generateCircularSeq</span> <span class="o">(</span><span class="n">lst</span><span class="o">:</span><span class="k">&#39;</span><span class="n">a</span> <span class="kt">list</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="k">rec</span> <span class="n">next</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">seq</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">element</span> <span class="k">in</span> <span class="n">lst</span> <span class="k">do</span>
</span><span class='line'>          <span class="k">yield</span> <span class="n">element</span>
</span><span class='line'>        <span class="k">yield</span><span class="o">!</span> <span class="n">next</span><span class="bp">()</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="n">next</span><span class="bp">()</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">str</span> <span class="k">in</span> <span class="o">[</span><span class="s2">&quot;John,Paul,George,Ringo&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="o">|&gt;</span> <span class="n">generateCircularSeq</span>
</span><span class='line'>  <span class="o">|&gt;</span> <span class="nn">Seq</span><span class="p">.</span><span class="n">take</span> <span class="mi">10</span>
</span><span class='line'>    <span class="k">do</span>  <span class="n">str</span> <span class="o">--&gt;&gt;</span> <span class="n">p1</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">x</span> <span class="o">=</span> <span class="nn">Console</span><span class="p">.</span><span class="nc">ReadKey</span><span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see the assignment of the pipeline stages is pretty simple as is the composition of multiple stages.  This was often one of the most difficult
areas while developing a similar pipelines in C# you could often find yourself with a few hundred lines of setup code which was a often a nightmare to debug
a few weeks later.</p>

<p>Hopefully I have whet your appetite with pipelines, in a future article I will be combining socket operations with pipeline stages to produce a flexible
framework to deal with high throughput network applications.</p>

<p>As always I appreciate any comments, until next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pipeline processing 2]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/02/13/pipeline-processing-2/"/>
    <updated>2011-02-13T12:32:38+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/02/13/pipeline-processing-2</id>
    <content type="html"><![CDATA[<h3>Welcome to pipeline processing part 2.</h3>

<p>I feel I need to backtrack slightly from the previous post, having worked with
pipelines for quite some time I have the advantage of knowing all of the
details that may be alluded to in these articles without being effected by any
omissions I may make, obviously you guys aren&#8217;t in that position, so I&#8217;m going
to try and rectify that a bit now.  If you have any queries then please leave
a comment and I will try to address them in further articles. Pipelines are a
simple concept but in practice there can be some caveats and things to bear in
mind, sometime the whole mindset of development team can be against them
unless they can see the bigger picture&#8230;<!-- more --></p>

<p>First of all one of the most important things to bear in mind with a pipeline
is that you are only going to be as fast as your slowest stage, if one stage
is ten times slower than another then it will be waiting for input most of the
time, we need to make this more efficient.</p>

<h4>Premature Optimisation</h4>

<p>Lots of developers out there have the <a href="http://www.c2.com/cgi/wiki?PrematureOptimization">premature optimisation is the root of
all evil</a> mindset and will
quote this out loud to you when you mention performance early on.  I&#8217;m not
advocating premature optimisation, in this instance performance is key, if one
stage is out of kilter with the rest then we are going to be running at that
pace of the slowest stage, if that&#8217;s too slow for the requirements then you
are screwed.</p>

<p>The more I think about performance the more I believe its an essential part of
creating code. There are too many developers these days that will produce
sloppy unrefined plain bad code.  I&#8217;m a keen believer in producing quality
code that you can be proud of, and part of that is having clean code that&#8217;s
both efficient and works.  I think some of this boils down to a feature driven
approach that measures developers solely in terms of features added, take the
typical <a href="http://en.wikipedia.org/wiki/Burn_down_chart">burn down chart</a> that
you would use in <a href="http://en.wikipedia.org/wiki/Agile_software_development">agile software development</a>:</p>

<p><img src="http://alistair.cockburn.us/get/1880" alt="" /></p>

<p>There is nowhere on this chart that measures whether the code is good or bad or runs to performance requirements.  In the future I may do an article on
integrating code quality into your build process, its something I have been thinking about doing for a while now.</p>

<p>While I&#8217;m talking about performance you also might want to check out Joe Duffy&#8217;s post on <a href="http://www.bluebyt%0Aesoftware.com/blog/2010/09/06/ThePrematureOptimizationIsEvilMyth.aspx">The &#8216;premature optimization is evil&#8217; myth</a>, and also check out Joe&#8217;s book on <a href="http://www.bluebytesoftw%0Aare.com/books/winconc/winconc_book_resources.html">concurrent programming</a>, put it on your wish list if you haven&#8217;t already read it, its a great book.</p>

<h4>Unbalanced pipelines</h4>

<p>Data is received from the network via packets, each packet may contain one or more messages from a business systems or indeed a partial message.  We need to
collect the packets either separate or combine them to form individual messages, deserialize them and finally log them.</p>

<p>Here&#8217;s a sample pipeline demonstrating an unbalanced pipeline:</p>

<p><img src="https://lh6.googleusercontent.com/-HDFpPk4zBzY/TwTnGvEn9kI/AAAAAAAABPE/CcRYtQ4fsEQ/pipeline.png"></p>

<ol>
<li>Stage 1 of the pipeline receives these packets and processes them into individual messages passing them onto Stage 2.</li>
<li>We now have a complete message (in this instance the message will be XML) we want to turn it into a .Net type we now deserialize the message and pass it onto Stage 3.</li>
<li>To keep this pipeline simple all we are going to do here is log type of message to disk or a database, the pipeline is now complete.</li>
</ol>


<p>Stage 1 would take 5 seconds to fully utilise stage 2, stage 2 would take 2
seconds to fully utilise stage 3.  You can see this pipeline will only process
100 transactions per second even though stages 2 has 5x the throughput of
stage 1 and stage 3 has 2x the throughput of stage 2.  Our efficiency is only
about 10% of what it could be, we must be able to do something about that.</p>

<p>Lets look at the following diagram which demonstrate a balanced pipeline:</p>

<h4>Balanced pipelines</h4>

<p><img src="https://lh4.googleusercontent.com/-8Pgq9ISPe4Q/TwTp1nwBzfI/AAAAAAAABPU/AUwLor1WI7o/balanced-pipeline.png"></p>

<p>You can see from this diagram that each stage processes the same number of
transactions per second by introducing parallel stages.  This is called a
balanced pipeline.  Sometimes you cant get a perfectly balanced pipeline but
you should strive to get as close as possible.  Sometimes a certain stage
cannot be parallelised because it may have mutable state, or you are using
some sort of <a href="http://en.wikipedia.org/wiki/Inversion_of_control">IOC</a>
container for processing services, this might make constructing the various
stages in parallel difficult, this can become an art form in itself and can
lead to very large initialisation sections in the code.  I hope to address all
of these issues in due course.</p>

<p>This poses some interesting thoughts and questions to add to some you may
already have:</p>

<ul>
<li>How can we easily manage the complexity of parallelism?</li>
<li>How will the distribution of work be handled?</li>
<li>How do you baseline the throughput of each stage?</li>
<li>Can you automate the parallelism of a particular stage?</li>
<li>How do you manage the complexity of multiple stages?</li>
<li>What about parallelism and mutable state?</li>
</ul>


<p>The final point to note is the Distributor/Router must operate at a much
higher rate than the processing stages otherwise you will introduce another
bottle neck into the system, although you could have a multiple distributors
but this would yet another degree of complexity that has to be managed.  You
can see that things can quickly become more complicated than they first
seemed.</p>

<p>I know I promised lots of funky code but I figured there was a bit more
explaining to do before we can get to that.  I want to take a more of an
iterative approach to show you the potential pitfalls that can occur during
developing such a pipeline and how to avoid them.  I thought this would be a
lot more constructive than dropping a load of code and some pretty pictures
and hoping for the best.</p>

<p>Next time we will be exploring a simple pipeline stage with a single degree of
parallelism and a simple router.  After that we will then start exploring and
answering the questions above, adding more features like parallelism,
instrumentation, and visualisation.</p>

<p>Hope you enjoyed this even though there was no code!</p>

<p>See you next time.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pipeline processing 1]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/02/01/pipeline-processing-1/"/>
    <updated>2011-02-01T01:13:43+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/02/01/pipeline-processing-1</id>
    <content type="html"><![CDATA[<h3>Welcome to new series of articles on pipeline processing.</h3>

<p>First up, what&#8217;s a pipeline?  Well according to <a href="http://en.wikipedia.org/wiki/Pipeline_(computing">Wikipedia</a>):</p>

<pre><code>A pipeline is a set of data processing elements connected in series, so that
the output of one element is the input of the next one. The elements of a
pipeline are often executed in parallel or in time-sliced fashion; in that
case, some amount of buffer storage is often inserted between elements.  
</code></pre>

<p>In essence its a way of dealing with complexity and its also a way of breaking
down a process into separate tasks of a similar size.  If they are used
correctly then pipelines can be used to increase the overall throughput of a
system.<!-- more --></p>

<p>In enterprise systems or in fact in most large systems, a simple idea or
program can rapidly become overwhelmingly complex.  The management all of the
disparate parts of the system can become a nightmare and the code can quickly
becomes a labyrinth, navigating it becomes a skill of only the most
accomplished code <em>ninja, </em>and even then your playing Russian roulette with
any bug fixes.In an effort to keep things manageable and simple one approach
that we can use is a pipeline. The idea is that each stage is connected to one
or more other stages and each that each stage deals with a single task before
passing the work onto the next stage.  There are many primitive types in the
<a href="http://msdn.microsoft.com/en-us/library/dd460717.aspx">Task Parallel Library</a>
(TPL) that you could use to compose a working pipeline, we will be using a
lightweight subset taking only a few core ideas and making sure we get a nice
slick design that is both powerful and flexible.</p>

<p>Here&#8217;s a quick flow diagram of the sort of thing that we will be looking at:</p>

<p><img src="https://lh5.googleusercontent.com/-55hM6Bez26w/TwTtHHXc-ZI/AAAAAAAABPo/LOgX1UywK0I/pipeline-tuv.png"></p>

<p>This is a generic asynchronous payload based pipeline.  Each stage is
asynchronous and self contained and is connected to one or more other stages.
As a payload enters the pipeline it is initially added to a bounding blocking
queue.  If the queue is full then the payload is said to have overflowed and
is passed to the failure processor where the payload can be processed or
transformed in some way before being passed to a failure router which would in
turn pass the payload to one or more of the next failure stages.  The same is
also true for a successfully queued payload except that the payload is first
dequeued, processed, then passed to a router which then passes the payload to
one or more stages.  If an exception occurs during processing then the payload
is passed to the failure processor and processed like an overflow.  I am
purposely missing out any details of asynchronous operation as they will be
described in more detail next time.</p>

<p>We will be using a little bit of <a href="http://tomasp.net/blog/fsharp-iv-lang.aspx">Language Oriented Programming</a>
to construct the pipeline stages, maybe using a little bit of operator overloading too.  
I will describe all of this in more detail next time as we dig into the code.  
I want this to be just a brief introduction to what we are going to be doing.</p>

<p>Here&#8217;s a more detailed description of the components that are involved in each
stage:</p>

<h2>Bounded Blocking Queue</h2>

<p>This is a standard bounded blocking queue from the TPL, its purpose here is to
limit the amount of payloads that are waiting to be processed, each queue will
have an associated time-out period, if the time-out period passes the payload
is passed to the failure processor for processing and then finally to the the
failure router to be passed to one or more failure stages.</p>

<h2>Processors</h2>

<p>Each pipeline processor has a primary Processor&lt;T,U> and a failure processor&lt;T,V>.</p>

<p>The primary processors job is to convert type T to type U, both types can be
the same if you wish, you may well be thinking why would I want a processing
stage that essentially leaves the type unchanged?  In this case the processor
acts as a simple a pass through but using this you to do some custom routing.
This can be very be useful in some scenarios and I will describing this in
more detail in a further post.</p>

<p>Each pipeline stage also has a failure processor&lt;T,V>.  The failure processor
acts on the payload to produce the desired type and passes it onto the failure
router.  The reasoning behind this scheme rather than a simplistic exception
logger is simply flexibility.  Having spent a lot of time with this kind of
API in a more locked down format I have found that you can end up wanting a
bit more flexibility especially when some developers try to get a bit creative
with the API or start state to the payload.  A good example of having some
flexibility is during overflow:  If the bounded blocking queue fills up and
blocks for the time-out period then the payload could be passed to a failure
failure processor in which types T and V are the same.  This would allow us to
pass the payload to another stage and retry later on by attaching some sort of
delayed forwarding pipeline stage.</p>

<h2>Routers</h2>

<p>The router is responsible for getting the payload to the next pipeline stage,
it can be implemented as a simple predicate function operating on the type
directly or even some outside influence if you wish.   An example of this
might be a simple duplicating stage where the payload is passed to multiple
output stages rather than just one, or a time based router where one stage is
passed the payload during the day and another at night.   When you start to
think about the possibilities the Processor / Router combination can be really
really flexible.</p>

<p>Each pipeline stage also has a corresponding has a failure router, this can be
used for all sorts of purposes like routing the failed payload to a logging
component, routing to a delayed retry mechanism, or saved to a database etc.</p>

<p>Thats all for now, we will be digging into some code and more detail next
time, and I will be describing a few different types of pipelines so you can
get a feel of how to use them and the overall structure.</p>

<p>Another interesting aspect of these pipelines is that once constructed they
can be composed into single reusable blocks that as a whole, represent a
single pipeline stage.  These composite stages can then be connected together
to form a super pipeline stage, complexity is only visible when you start to
drill down and becomes almost fractal like&#8230;</p>

<p>As always please leave any comments or suggestions.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sockets and Bockets 4]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/01/28/sockets-and-bockets-part-4/"/>
    <updated>2011-01-28T14:31:55+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/01/28/sockets-and-bockets-part-4</id>
    <content type="html"><![CDATA[<h2>Welcome to part 4</h2>

<p>If you were looking forward to some exciting new F# code this time your going
to be disappointed, however if you are like me and like looking at graphs and
stats and digging in deeper into the code then your going to enjoy this, lets
get started&#8230;<!-- more --></p>

<p>I set up a 5 minute test with 50 clients connecting to the server with a 15ms
interval between each one.  Once connected each client receives a 128 byte
message from the server every 100ms so this will be a 500 messages per second
test.  I am going to be using an excellent product called <a href="http://bit.ly/e4ToaO">YourKit Profilerfor .NET</a> it can do both memory and CPU profiling as
well as displaying telemetry for things like thread count, stack contents,
memory allocations etc.  It can be configured to be a lot less intrusive than
a lot of other profilers and I have had a lot of success using it.  You can
download a demo from their site using the link above.  I will be doing some
other articles on using profiling and analysis tools later on so stay tuned
for those too.  All of the graphs and information gathered in this post come
from YourKits output during CPU and memory profiling.</p>

<p>Before we start here&#8217;s a reminder of what the client code looks like, this is
a simple test client using Brian&#8217;s code as mentioned in
<a href="http://moiraesoftware.com/?p=39">Part1</a> I have highlighted the lines that
have changed below.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>
</span><span class='line'>    <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Net</span>
</span><span class='line'>    <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nc">Sockets</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">quoteSize</span> <span class="o">=</span> <span class="mi">128</span>
</span><span class='line'>    <span class="k">type</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nn">Sockets</span><span class="p">.</span><span class="nc">TcpClient</span> <span class="k">with</span>
</span><span class='line'>      <span class="k">member</span> <span class="n">client</span><span class="o">.</span><span class="nc">AsyncConnect</span><span class="o">(</span><span class="n">server</span><span class="o">,</span> <span class="n">port</span><span class="o">,</span> <span class="n">clientIndex</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>        <span class="nn">Async</span><span class="p">.</span><span class="nc">FromBeginEnd</span><span class="o">(</span><span class="n">server</span><span class="o">,</span> <span class="n">port</span><span class="o">,(</span><span class="n">client</span><span class="o">.</span><span class="nc">BeginConnect</span> <span class="o">:</span> <span class="nc">IPAddress</span> <span class="o">*</span> <span class="kt">int</span> <span class="o">*</span> <span class="o">_</span> <span class="o">*</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="o">_),</span> <span class="n">client</span><span class="o">.</span><span class="nc">EndConnect</span><span class="o">)</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">clientRequestQuoteStream</span> <span class="o">(</span><span class="n">clientIndex</span><span class="o">,</span> <span class="n">server</span><span class="o">,</span> <span class="n">port</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nn">Sockets</span><span class="p">.</span><span class="nc">TcpClient</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">do</span><span class="o">!</span>  <span class="n">client</span><span class="o">.</span><span class="nc">AsyncConnect</span><span class="o">(</span><span class="n">server</span><span class="o">,</span><span class="n">port</span><span class="o">,</span> <span class="n">clientIndex</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">stream</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="nc">GetStream</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">let</span><span class="o">!</span> <span class="n">header</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="nc">AsyncRead</span> <span class="mi">1</span> <span class="c1">// read header</span>
</span><span class='line'>        <span class="k">while</span> <span class="bp">true</span> <span class="k">do</span>
</span><span class='line'>          <span class="k">let</span><span class="o">!</span> <span class="n">bytes</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="nc">AsyncRead</span> <span class="n">quoteSize</span>
</span><span class='line'>          <span class="k">if</span> <span class="nn">Array</span><span class="p">.</span><span class="n">length</span> <span class="n">bytes</span> <span class="o">&lt;&gt;</span> <span class="n">quoteSize</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">printfn</span> <span class="s2">&quot;client incorrect checksum&quot;</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">myLock</span> <span class="o">=</span> <span class="k">new</span> <span class="n">obj</span><span class="bp">()</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">clientAsync</span> <span class="n">clientIndex</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span><span class="o">(</span><span class="n">clientIndex</span><span class="o">*</span><span class="mi">15</span><span class="o">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">clientIndex</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">then</span>
</span><span class='line'>          <span class="n">lock</span> <span class="n">myLock</span> <span class="o">(</span><span class="k">fun</span><span class="bp">()</span> <span class="o">-&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;%d clients...&quot;</span> <span class="n">clientIndex</span><span class="o">)</span>
</span><span class='line'>        <span class="k">try</span>
</span><span class='line'>          <span class="k">do</span><span class="o">!</span> <span class="n">clientRequestQuoteStream</span> <span class="o">(</span><span class="n">clientIndex</span><span class="o">,</span> <span class="nn">IPAddress</span><span class="p">.</span><span class="nc">Loopback</span><span class="o">,</span> <span class="mi">10003</span><span class="o">)</span>
</span><span class='line'>        <span class="k">with</span> <span class="n">e</span> <span class="o">-&gt;</span>
</span><span class='line'>          <span class="n">printfn</span> <span class="s2">&quot;CLIENT %d ERROR: %A&quot;</span> <span class="n">clientIndex</span> <span class="n">e</span>
</span><span class='line'>          <span class="c1">//raise e</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="nn">Async</span><span class="p">.</span><span class="nc">Parallel</span> <span class="o">[</span> <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span> <span class="o">..</span> <span class="mi">50</span> <span class="o">-&gt;</span> <span class="n">clientAsync</span> <span class="n">i</span> <span class="o">]</span>
</span><span class='line'>      <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Ignore</span>
</span><span class='line'>      <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span>
</span><span class='line'>    <span class="nn">System</span><span class="p">.</span><span class="nn">Console</span><span class="p">.</span><span class="nc">ReadKey</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span></code></pre></td></tr></table></div></figure>


<h2>CPU and threading performance</h2>

<p>First of all lets look at the CPU results from the <em>IAsync</em> pattern:</p>

<p><img src="https://lh5.googleusercontent.com/-3H8-TiiB-VI/TwYhL2mvYsI/AAAAAAAABQI/z8dmiHBvTJE/mcnamara-cpu1.png"></p>

<p>Heres the same run from the SAEA pattern:</p>

<p><img src="https://lh3.googleusercontent.com/-yGB2zdE3kGM/TwYhLPrUmLI/AAAAAAAABP8/Y6CIMWOi4Gk/Bocket-cpu2.png"></p>

<p>You can see that both the number of threads and the amount of CPU is a quite a
lot less in the SAEA pattern.  The spike at the beginning is the allocation of
buffers for the BocketPool.</p>

<p>Now lets move on to memory and garbage collection.</p>

<h2>Memory Allocation</h2>

<p>Here&#8217;s a graph of the heap and process memory allocation in the <strong>IAsync</strong>
pattern, green is generation 0, blue is generation 1 and orange is the large
object heap.  There&#8217;s also red for generation 2 but the results are behind the
others and they are only small 0,2 MB peaks at 5 to 15 second intervals.</p>

<p><img src="https://lh3.googleusercontent.com/-PalohQxAkOg/TwYhL6hR5JI/AAAAAAAABQQ/NtCLYc43OZc/mcnamara-mem1.png"></p>

<p>Heres the same but for the SAEA pattern, there are red peaks every 10- 20
second intervals of 0.2MB hidden under the others.</p>

<p><img src="https://lh3.googleusercontent.com/-Nadz1nXQ7lg/TwYhLBXMvcI/AAAAAAAABQM/xCfuXkzkekM/Bocket-mem1.png"></p>

<p>As you can see the heap memory is around half the size and the process memory is 15MB less.</p>

<h2>Memory Hotspots</h2>

<p>Finally here&#8217;s a couple of screen shot of the hot spots for memory allocations
in both implementations</p>

<p><img src="https://lh4.googleusercontent.com/-n3QWLgvNjq8/TwYhLX8cIZI/AAAAAAAABQA/LkeRno775Ew/s800/IAsync-hot.png" title="IAsync" ></p>

<p><img src="https://lh5.googleusercontent.com/-PSX_YUfxkgU/TwYhMr40DTI/AAAAAAAABQY/D8bgLS6kNwc/s800/SAEA-hot.png" title="SAEA" ></p>

<p>You can clearly the <strong>IAsync</strong> allocations are not present in the SAEA
implementation and there are 310,188 of them, that&#8217;s 27% of the total garbage!</p>

<h2>Final thoughts</h2>

<p>The SAEA pattern definitely cuts down on memory and CPU usage, yes it adds a
lot of complexity but if your application is dealing with a very high volume
of traffic or clients and you need optimal performance then I think its the
way to go.</p>

<p>The optimisations don&#8217;t stop there either, if you think about it the receive
Bocketpool is not even used here, if we collapsed all of the BocketPools into
a single contiguous store then we would use even less resources, this means we
could support even more clients or throughput.  In a typical high volume
scenario you are looking at doubling your throughput or number of client
connections.</p>

<p>There&#8217;s definitely a lot more or interesting things to explore in this area.</p>

<p>As usual any comments are welcome.</p>

<p>See you next time&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sockets and Bockets 3]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/01/20/sockets-and-bockets-part-3/"/>
    <updated>2011-01-20T01:17:55+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/01/20/sockets-and-bockets-part-3</id>
    <content type="html"><![CDATA[<h2>Welcome to part three!</h2>

<p>As promised heres a description of the inner workings.  I&#8217;m sick to death of
typing SocketAsyncEventArgs so from now on I will refer to it as SAEA.<!-- more --></p>

<p><strong>BocketPool</strong><br/>
The BocketPool has an interesting name and with it an interesting constructor!
It takes the following parameters:</p>

<p><strong>number</strong>: The number of items to create in the BocketPool. <strong>size</strong>: The size of each buffer in bytes. <strong>callback</strong>: A callback function which is invoked whenever the SAEA object completes its operation.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">BocketPool</span><span class="o">(</span> <span class="n">number</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">callback</span><span class="o">)</span> <span class="k">as</span> <span class="n">this</span> <span class="o">=</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">number</span> <span class="o">=</span> <span class="n">number</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">size</span> <span class="o">=</span> <span class="n">size</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">totalsize</span> <span class="o">=</span> <span class="o">(</span><span class="n">number</span> <span class="o">*</span> <span class="n">size</span><span class="o">)</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">buffer</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">create</span> <span class="n">totalsize</span> <span class="mi">0</span><span class="n">uy</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">pool</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BlockingCollection</span><span class="o">&lt;</span><span class="nc">SocketAsyncEventArgs</span><span class="o">&gt;(</span><span class="n">number</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>A <strong>buffer</strong> is created with a size equal to the (<strong>number</strong> * <strong>size</strong>)
in bytes.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">do</span>
</span><span class='line'>      <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span> <span class="n">n</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">n</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span> <span class="n">x</span> <span class="k">when</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">totalsize</span> <span class="o">-&gt;</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">saea</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SocketAsyncEventArgs</span><span class="bp">()</span>
</span><span class='line'>          <span class="n">saea</span><span class="o">.</span><span class="nc">Completed</span> <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">add</span> <span class="n">callback</span>
</span><span class='line'>          <span class="n">saea</span><span class="o">.</span><span class="nc">SetBuffer</span><span class="o">(</span><span class="n">buffer</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">size</span><span class="o">)</span>
</span><span class='line'>          <span class="n">this</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">saea</span><span class="o">)</span>
</span><span class='line'>          <span class="n">loop</span> <span class="o">(</span><span class="n">n</span> <span class="o">+</span> <span class="n">size</span><span class="o">)</span>
</span><span class='line'>        <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span><span class='line'>      <span class="n">loop</span> <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure>


<p>The tail recursive loop function creates a SAEA object and adds it to the
BlockingCollection(pool).</p>

<p>The buffer is assigned to each SAEA but each is given a unique offset to use,
this is done by the SetBuffer method.  Using this method of allocation, memory
fragmentation is reduced to a minimum by allowing the same buffer to be
reused.</p>

<p>We use the pipeline operator to attach the <strong>Completed</strong> event to the callback
method that is passed in the constructor.</p>

<p>The CheckIn, CheckOut, and Count methods are simply wrappers around the
BlockingCollection.</p>

<p>We also implement <strong>IDisposable</strong> to take care of the disposal of the SAEA in the
BlockingCollection.</p>

<p><strong>Connection</strong><br/>
The main purpose for this type is to encapsulate the sending and receiving of
messages for a particular client. A BocketPool is created for both the send
and receive operations, the receiveCompleted and SentCompleted are invoked
when the respective operations complete.</p>

<p><strong>Send</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Send</span> <span class="o">(</span><span class="n">msg</span><span class="o">:</span><span class="kt">byte</span><span class="bp">[]</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>  <span class="k">let</span> <span class="n">s</span> <span class="o">=</span> <span class="n">sendPool</span><span class="o">.</span><span class="nc">CheckOut</span><span class="bp">()</span>
</span><span class='line'>  <span class="nn">Buffer</span><span class="p">.</span><span class="nc">BlockCopy</span><span class="o">(</span><span class="n">msg</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">s</span><span class="o">.</span><span class="nc">Buffer</span><span class="o">,</span> <span class="n">s</span><span class="o">.</span><span class="nc">Offset</span><span class="o">,</span> <span class="n">msg</span><span class="o">.</span><span class="nc">Length</span><span class="o">)</span>
</span><span class='line'>  <span class="n">socket</span><span class="o">.</span><span class="nc">SendAsyncSafe</span><span class="o">(</span><span class="n">this</span><span class="o">.</span><span class="n">sendCompleted</span><span class="o">,</span> <span class="n">s</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Initially a Bocket is checked out of the sendPool using sendPool.Checkout(),
the <strong>msg</strong> byte array is copied to the corresponding <strong>Offset</strong> property of
the SAEA.</p>

<p>Finally the SendAsyncSafe extension method is called passing in the SAEA and
the callback.</p>

<p><strong>sendCompleted</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">sendCompleted</span> <span class="o">(</span><span class="n">args</span><span class="o">:</span> <span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">try</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span> <span class="nn">SocketAsyncOperation</span><span class="p">.</span><span class="nc">Send</span> <span class="o">-&gt;</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">SocketError</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">Success</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="bp">()</span>
</span><span class='line'>          <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">NoBufferSpaceAvailable</span>
</span><span class='line'>          <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">IOPending</span>
</span><span class='line'>          <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">WouldBlock</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="k">if</span> <span class="ow">not</span><span class="o">(</span><span class="n">anyErrors</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>              <span class="n">anyErrors</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>              <span class="n">failwith</span> <span class="s2">&quot;Buffer overflow or send buffer timeout&quot;</span>
</span><span class='line'>          <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nn">SocketError</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;socket error on send: %s&quot;</span>
</span><span class='line'>        <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failwith</span> <span class="s2">&quot;invalid operation, should be receive&quot;</span>
</span><span class='line'>      <span class="k">finally</span>
</span><span class='line'>        <span class="n">sendPool</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">args</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function matches the LastOperation property of the SAEA using pattern
matching, this ensures that the LastOperation is always SocketError.Success.</p>

<p>We raise exceptions on NoBufferSpaceAvailable, IOPending, and WouldBlock as
buffer overflows and match any other conditions the wildcard.</p>

<p>Finally we Check the Bocket back in so that it can be reused.</p>

<p><strong>receiveCompleted</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">receiveCompleted</span> <span class="o">(</span><span class="n">args</span><span class="o">:</span> <span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">try</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span> <span class="nn">SocketAsyncOperation</span><span class="p">.</span><span class="nc">Receive</span> <span class="o">-&gt;</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">SocketError</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">Success</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="nc">ReceiveAsyncSafe</span><span class="o">(</span> <span class="n">this</span><span class="o">.</span><span class="n">receiveCompleted</span><span class="o">,</span> <span class="n">receivePool</span><span class="o">.</span><span class="nc">CheckOut</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">create</span> <span class="n">args</span><span class="o">.</span><span class="nc">BytesTransferred</span> <span class="mi">0</span><span class="n">uy</span>
</span><span class='line'>            <span class="nn">Buffer</span><span class="p">.</span><span class="nc">BlockCopy</span><span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="nc">Buffer</span><span class="o">,</span> <span class="n">args</span><span class="o">.</span><span class="nc">Offset</span><span class="o">,</span> <span class="n">data</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">data</span><span class="o">.</span><span class="nc">Length</span><span class="o">)</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">client</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="nc">RemoteEndPoint</span>
</span><span class='line'>            <span class="n">args</span><span class="o">.</span><span class="nc">RemoteEndPoint</span> <span class="o">&lt;-</span> <span class="k">null</span>
</span><span class='line'>            <span class="n">data</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;received data: %A&quot;</span>
</span><span class='line'>          <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nn">SocketError</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;socket error on receive: %s&quot;</span>
</span><span class='line'>        <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failwith</span> <span class="s2">&quot;unknown operation, should be receive&quot;</span>
</span><span class='line'>      <span class="k">finally</span>
</span><span class='line'>        <span class="n">receivePool</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">args</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function is very similar to the sendCompleted and could probably be
refactored a bit using the <a href="http://enfranchisedmind.com/blog/posts/the-hole-in-the-middle-%0Apattern/">Hole in the middle
pattern</a>.  Again we check to ensure the last operation was a success, we
checkout another Bocket and start another ReceiveAsyncSafe. This ensures that
the socket can begin another receive operation as soon as possible while we
take the data from the SAEA Buffer, we do this with Buffer.Block copy.</p>

<p>If this were a fully-fledged API then we would raise an event here so that
users of the component could consume the data.</p>

<p>In my own component the data is inserted into a series of processing stages
using the <a href="http://www.cise.ufl.edu/research/ParallelPatterns%0A/PatternLanguage/AlgorithmStructure/Pipeline.htm">Pipeline Pattern</a>, which I will be may
describe in a future post if anyone&#8217;s interested.</p>

<p><strong>TcpListener</strong><br/>
The TcpListener is very similar to the Connection object in that it has a pool
of SAEA objects that are used to accept connection from clients, again a round
of refactoring could be done here to avoid duplication with the Connection
type.  The main difference is that we don&#8217;t need to use the Buffer on the SAEA
to send anything to the client when it initially connects.</p>

<p><strong>acceptCompleted</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span> <span class="o">(</span><span class="n">args</span> <span class="o">:</span> <span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">try</span>
</span><span class='line'>        <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="k">with</span>
</span><span class='line'>        <span class="o">|</span> <span class="nn">SocketAsyncOperation</span><span class="p">.</span><span class="nc">Accept</span> <span class="o">-&gt;</span>
</span><span class='line'>          <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">SocketError</span> <span class="k">with</span>
</span><span class='line'>          <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">Success</span> <span class="o">-&gt;</span>
</span><span class='line'>            <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">AcceptAsyncSafe</span><span class="o">(</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span><span class="o">,</span> <span class="n">acceptPool</span><span class="o">.</span><span class="nc">Take</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>            <span class="c1">//create new connection</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">connection</span> <span class="o">=</span> <span class="n">newConnection</span> <span class="n">args</span><span class="o">.</span><span class="nc">AcceptSocket</span>
</span><span class='line'>            <span class="n">connection</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span>
</span><span class='line'>            <span class="c1">//update stats</span>
</span><span class='line'>            <span class="n">reportConnections</span>
</span><span class='line'>            <span class="c1">//async start of messages to client</span>
</span><span class='line'>            <span class="n">startSending</span> <span class="n">connection</span>
</span><span class='line'>            <span class="c1">//remove the AcceptSocket because we will be reusing args</span>
</span><span class='line'>            <span class="n">args</span><span class="o">.</span><span class="nc">AcceptSocket</span> <span class="o">&lt;-</span> <span class="k">null</span>
</span><span class='line'>          <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nn">SocketError</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;socket error on accept: %s&quot;</span>
</span><span class='line'>        <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="o">|&gt;</span> <span class="n">failwith</span> <span class="s2">&quot;Unknown operation, should be accept but was %a&quot;</span>
</span><span class='line'>      <span class="k">finally</span>
</span><span class='line'>        <span class="n">acceptPool</span><span class="o">.</span><span class="nc">Add</span><span class="o">(</span><span class="n">args</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function is similar to the send and receive completed methods in the
Connection type, although this time we create a Connection object and call the
Start function, this puts the Connection into receive mode.</p>

<p>The reportConnections is called next which simply prints how many clients are
connected, we now start an Asyncronous workflow using the startSending
function.</p>

<p>Finally we set the AcceptSocket property to null on the SAEA object and add it
back to the BlockingCollection so that it can be reused.</p>

<p>The purpose of the BlockingCollection here is to have a fixed pool of SAEA
that block when there isn&#8217;t an SAEA to service the new connection, this could
be a potential issue for the client as it could timeout while waiting for a
connection but this is a far preferable situation than causing your server to
be effectively denied service due to overload.</p>

<p><strong>startSending</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">startSending</span> <span class="n">connection</span> <span class="o">=</span>
</span><span class='line'>      <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span> <span class="o">(</span><span class="n">async</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">try</span>
</span><span class='line'>          <span class="k">use</span> <span class="o">_</span><span class="n">holder</span> <span class="o">=</span> <span class="n">connection</span>
</span><span class='line'>          <span class="k">do</span><span class="o">!</span> <span class="n">asyncServiceClient</span> <span class="n">connection</span>
</span><span class='line'>        <span class="k">with</span> <span class="n">e</span> <span class="o">-&gt;</span>
</span><span class='line'>          <span class="k">if</span> <span class="ow">not</span><span class="o">(</span><span class="n">anyErrors</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">anyErrors</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>            <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span><span class="s2">&quot;server ERROR&quot;</span><span class="o">)</span>
</span><span class='line'>          <span class="n">raise</span> <span class="n">e</span>
</span><span class='line'>        <span class="o">}</span> <span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function uses the syntactic sugar of the asynchronous workflows to start
an operation on the Thread pool, once queued on the thread pool it is wrapped
in a using block with the <strong><em>use </em>holder = connection_</strong> statement and
asynchronously calls the asyncServiceClient function, this has the effect of
disposing of the Connection type when it exits scope or encounters an
exception.</p>

<p><strong>asyncServiceClient</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">asyncServiceClient</span> <span class="o">(</span><span class="n">client</span><span class="o">:</span> <span class="nc">Connection</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">client</span><span class="o">.</span><span class="nc">Send</span><span class="o">(</span><span class="n">header</span><span class="o">)</span>
</span><span class='line'>      <span class="k">while</span> <span class="bp">true</span> <span class="k">do</span>
</span><span class='line'>        <span class="k">do</span><span class="o">!</span> <span class="n">asyncWriteStockQuote</span><span class="o">(</span><span class="n">client</span><span class="o">)</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function sends a one byte header message to the client using the
Connection.Send, followed by calling asyncWriteStockQuote in a continuous
loop.</p>

<p><strong>asyncWriteStockQuote</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">asyncWriteStockQuote</span><span class="o">(</span><span class="n">connection</span><span class="o">:</span><span class="nc">Connection</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>      <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">1000</span>
</span><span class='line'>      <span class="n">connection</span><span class="o">.</span><span class="nc">Send</span><span class="o">(</span><span class="n">testMessage</span><span class="o">)</span>
</span><span class='line'>      <span class="nn">Interlocked</span><span class="p">.</span><span class="nc">Increment</span><span class="o">(&amp;</span><span class="n">numWritten</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">ignore</span> <span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function sleeps for 1000ms and uses the Connection.Send function to sent
a message to the client, the number of results is updated using the
Interlocked class.</p>

<p>I would like to refer you to <a href="http://lorgonblog.wordpress.com/2010/03/28/f-async-on-the-server-side/">Brian McNamara&#8217;s
post</a>
that describes this part in more detail.  The only difference in our workflow
is that we don&#8217;t use a stream operation as we have the SendAsyncSafe function
to do all the work for us.  IDispose is also implemented on this type too as
we have to dispose of the SAEA objects that are used for the asynchronous
accepts.</p>

<p><strong>createTcpSocket</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">createTcpSocket</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">new</span> <span class="nc">Socket</span><span class="o">(</span><span class="nn">AddressFamily</span><span class="p">.</span><span class="nc">InterNetwork</span><span class="o">,</span> <span class="nn">SocketType</span><span class="p">.</span><span class="nc">Stream</span><span class="o">,</span> <span class="nn">ProtocolType</span><span class="p">.</span><span class="nc">Tcp</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function simply wraps the Sockets class constructor mapping it to: Tcp
protocol, Streaming, and InterNetwork Address type.</p>

<p><strong>createListener</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">createListener</span> <span class="o">(</span><span class="n">ip</span><span class="o">:</span><span class="nc">IPAddress</span><span class="o">,</span> <span class="n">port</span><span class="o">,</span> <span class="n">backlog</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">s</span> <span class="o">=</span> <span class="n">createTcpSocket</span><span class="bp">()</span>
</span><span class='line'>      <span class="n">s</span><span class="o">.</span><span class="nc">Bind</span><span class="o">(</span><span class="k">new</span> <span class="nc">IPEndPoint</span><span class="o">(</span><span class="n">ip</span><span class="o">,</span> <span class="n">port</span><span class="o">))</span>
</span><span class='line'>      <span class="n">s</span><span class="o">.</span><span class="nc">Listen</span><span class="o">(</span><span class="n">backlog</span><span class="o">);</span> <span class="n">s</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function calls the createTcpSocket function, binds to the IPAddress and
port that are passed in and starts listening for connections.</p>

<p><strong>Start</strong></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">start</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>      <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">AcceptAsyncSafe</span><span class="o">(</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span><span class="o">,</span> <span class="n">acceptPool</span><span class="o">.</span><span class="nc">Take</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>      <span class="k">while</span> <span class="bp">true</span> <span class="k">do</span>
</span><span class='line'>      <span class="nn">Thread</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">1000</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">count</span> <span class="o">=</span> <span class="nn">Interlocked</span><span class="p">.</span><span class="nc">Exchange</span><span class="o">(&amp;</span><span class="n">numWritten</span><span class="o">,</span> <span class="mi">0</span><span class="o">)</span>
</span><span class='line'>      <span class="n">count</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;Quotes per sec: %A&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This function starts the whole process of listening for a connection from
clients.  A SAEA is taken from the BlockingCollection and AcceptAsyncSafe is
called.</p>

<p>I have tried to describe all of the functions that I think merit a description
but I have been involved in this sort of code for years now so if you have any
queries feel free to just drop a comment and I will try to help.</p>

<p>When looking through the code remember that this is just a demo, I am
currently still working on a few things but may offer the full API available
for download at a later date or put it on GitHub.</p>

<p>In part four we are going to compare some of the differences in operation
between the xxxAsync and the IAsync pattern, obviously there is a lot more
code and inherent complexity in this implementation but in high volume
situations it makes a lot of difference.</p>

<p>See you next time.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sockets and Bockets 2]]></title>
    <link href="http://MoiraeSoftware.com/blog/2011/01/14/sockets-and-bockets-part-2/"/>
    <updated>2011-01-14T22:29:16+00:00</updated>
    <id>http://MoiraeSoftware.com/blog/2011/01/14/sockets-and-bockets-part-2</id>
    <content type="html"><![CDATA[<h3>Welcome to part two</h3>

<p>Lets jump in at the deep end and take a look at some code&#8230;</p>

<p>When you look at the method syntax for the xxxAsync methods you will notice
they return a boolean value that indicates if the method completed
synchronously, this means that you have to check the return value every time
you use one of the methods and invoke the callback yourself if it completes
synchronously.  In practice this hardly ever happens, and normally only on a
send operation.  But as it is a possibility we will add module with a some
extension methods in to help us out, this will make the code more readable and
avoid unnecessary duplication.<!-- more --></p>

<h3>SocketExtensions</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">module</span> <span class="nc">SocketExtensions</span>
</span><span class='line'>  <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>  <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Net</span>
</span><span class='line'>  <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nc">Sockets</span>
</span><span class='line'>  <span class="k">type</span> <span class="nc">Socket</span> <span class="k">with</span>
</span><span class='line'>    <span class="c1">/// extension method to make async based call easier, this ensures the callback always gets</span>
</span><span class='line'>    <span class="c1">/// called even if there is an error or the async method completed syncronously</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">s</span><span class="o">.</span><span class="nc">InvokeAsyncMethod</span><span class="o">(</span> <span class="n">asyncmethod</span><span class="o">,</span> <span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">:</span><span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="n">asyncmethod</span> <span class="n">args</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">result</span> <span class="o">&lt;&gt;</span> <span class="bp">true</span> <span class="k">then</span> <span class="n">callback</span> <span class="n">args</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">s</span><span class="o">.</span><span class="nc">AcceptAsyncSafe</span><span class="o">(</span><span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="nc">InvokeAsyncMethod</span><span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="nc">AcceptAsync</span><span class="o">,</span> <span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">s</span><span class="o">.</span><span class="nc">ReceiveAsyncSafe</span><span class="o">(</span><span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="nc">InvokeAsyncMethod</span><span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="nc">ReceiveAsync</span><span class="o">,</span> <span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">s</span><span class="o">.</span><span class="nc">SendAsyncSafe</span><span class="o">(</span><span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="nc">InvokeAsyncMethod</span><span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="nc">SendAsync</span><span class="o">,</span> <span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span>
</span><span class='line'>    <span class="k">member</span> <span class="n">s</span><span class="o">.</span><span class="nc">DisconnectAsyncSafe</span><span class="o">(</span><span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="nc">InvokeAsyncMethod</span><span class="o">(</span><span class="n">s</span><span class="o">.</span><span class="nc">DisconnectAsync</span><span class="o">,</span> <span class="n">callback</span><span class="o">,</span> <span class="n">args</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now lets get down to business, the next few types have a fair bit of code in
them so I will briefly explain each type in turn:</p>

<h3>BocketPool</h3>

<p>A BocketPool is a combination of a
<a href="http://msdn.microsoft.com/en-%0Aus/library/system.net.sockets.socketasynceventargs.aspx">SocketAsyncEventArgs</a> object and a chunk of
memory allocated in an array.  The array is sliced up into sections and
allocated for each send or receive operation by setting a start and end index
using <a href="http://msdn.microsoft.com/en-us/library/bb549836.aspx">SetBuffer()</a>.
If you remember last time I mentioned that a lot of memory fragmentation can
occur during sending and receiving due to continuously allocating memory
buffers on the Socket object, this is primarily done through the BeginSend and
BeginReceive methods passing in a byte array.  Using the BocketPool it a great
way of reducing the amount of garbage collection during heavy traffic.</p>

<p>The other major difference with SocketAsyncEventArgs is the way in which you
make the send and receive calls, heres the general flow that occurs:</p>

<ul>
<li>Create a SocketAsyncEventArgs object or get one from a pool.</li>
<li>Allocate an array to the buffer.</li>
<li>Allocate an offset and length to the buffer.</li>
<li>Allocate a callback method.</li>
<li>Call Socket.xxxAsync passing in the SocketAsyncEventArgs, the operation will complete and invoke the callback.</li>
</ul>


<p>What we are going to do is wrap the whole creation, array allocation, and
offsetting to the BocketPool:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">namespace</span> <span class="nc">Fes</span>
</span><span class='line'>      <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nc">Sockets</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Concurrent</span>
</span><span class='line'>      <span class="k">type</span> <span class="nc">BocketPool</span><span class="o">(</span> <span class="n">number</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">callback</span><span class="o">)</span> <span class="k">as</span> <span class="n">this</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">number</span> <span class="o">=</span> <span class="n">number</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">size</span> <span class="o">=</span> <span class="n">size</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">totalsize</span> <span class="o">=</span> <span class="o">(</span><span class="n">number</span> <span class="o">*</span> <span class="n">size</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">buffer</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">create</span> <span class="n">totalsize</span> <span class="mi">0</span><span class="n">uy</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">pool</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BlockingCollection</span><span class="o">&lt;</span><span class="nc">SocketAsyncEventArgs</span><span class="o">&gt;(</span><span class="n">number</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">disposed</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">cleanUp</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">if</span> <span class="ow">not</span> <span class="n">disposed</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">disposed</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>            <span class="n">pool</span><span class="o">.</span><span class="nc">CompleteAdding</span><span class="bp">()</span>
</span><span class='line'>            <span class="k">while</span> <span class="n">pool</span><span class="o">.</span><span class="nc">Count</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">do</span>
</span><span class='line'>              <span class="o">(</span><span class="n">pool</span><span class="o">.</span><span class="nc">Take</span><span class="bp">()</span> <span class="o">:&gt;</span> <span class="nc">IDisposable</span><span class="o">).</span><span class="nc">Dispose</span><span class="bp">()</span>
</span><span class='line'>            <span class="n">pool</span><span class="o">.</span><span class="nc">Dispose</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">do</span>
</span><span class='line'>          <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span> <span class="n">n</span> <span class="o">=</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">n</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span> <span class="n">x</span> <span class="k">when</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">totalsize</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">let</span> <span class="n">saea</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SocketAsyncEventArgs</span><span class="bp">()</span>
</span><span class='line'>              <span class="n">saea</span><span class="o">.</span><span class="nc">Completed</span> <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">add</span><span class="o">(</span> <span class="k">fun</span> <span class="n">saea</span> <span class="o">-&gt;</span> <span class="o">(</span><span class="n">callback</span> <span class="n">saea</span><span class="o">))</span>
</span><span class='line'>              <span class="n">saea</span><span class="o">.</span><span class="nc">SetBuffer</span><span class="o">(</span><span class="n">buffer</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">size</span><span class="o">)</span>
</span><span class='line'>              <span class="n">this</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">saea</span><span class="o">)</span>
</span><span class='line'>              <span class="n">loop</span> <span class="o">(</span><span class="n">n</span> <span class="o">+</span> <span class="n">size</span><span class="o">)</span>
</span><span class='line'>            <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span><span class='line'>          <span class="n">loop</span> <span class="mi">0</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">CheckOut</span><span class="bp">()</span><span class="o">=</span>
</span><span class='line'>          <span class="n">pool</span><span class="o">.</span><span class="nc">Take</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">saea</span><span class="o">)=</span>
</span><span class='line'>          <span class="n">pool</span><span class="o">.</span><span class="nc">Add</span><span class="o">(</span><span class="n">saea</span><span class="o">)</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Count</span> <span class="o">=</span>
</span><span class='line'>          <span class="n">pool</span><span class="o">.</span><span class="nc">Count</span>
</span><span class='line'>        <span class="k">interface</span> <span class="nc">IDisposable</span> <span class="k">with</span>
</span><span class='line'>          <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Dispose</span><span class="bp">()</span> <span class="o">=</span> <span class="n">cleanUp</span><span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next up we have to look at the Connection and the Tcplistener types as two
interconnected entities:</p>

<ul>
<li>The TcpListener listens for a connection on a socket and port number.</li>
<li>The client connects to the server.</li>
<li>An accept socket is allocated to the client, at this point we have one socket for the server and once for each client.</li>
<li>We also need to allocate a BocketPool for send and receive operation for each client
To simplify things we are going to encapsulate the accept socket management
into a type, it will also need a corresponding BocketPool to service any send
and receive operations to and from the client</li>
</ul>


<h3>Connection</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">namespace</span> <span class="nc">Fes</span>
</span><span class='line'>      <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Net</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nc">Sockets</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Generic</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Concurrent</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Threading</span>
</span><span class='line'>      <span class="k">open</span> <span class="nc">SocketExtensions</span>
</span><span class='line'>      <span class="k">type</span> <span class="nc">Connection</span><span class="o">(</span><span class="n">maxreceives</span><span class="o">,</span> <span class="n">maxsends</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">socket</span><span class="o">:</span><span class="nc">Socket</span><span class="o">)</span> <span class="k">as</span> <span class="n">this</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">socket</span> <span class="o">=</span> <span class="n">socket</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">maxreceives</span> <span class="o">=</span> <span class="n">maxreceives</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">maxsends</span> <span class="o">=</span> <span class="n">maxsends</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">sendPool</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BocketPool</span><span class="o">(</span><span class="n">maxsends</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">this</span><span class="o">.</span><span class="n">sendCompleted</span> <span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">receivePool</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BocketPool</span><span class="o">(</span><span class="n">maxreceives</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">this</span><span class="o">.</span><span class="n">receiveCompleted</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">disposed</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">anyErrors</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">cleanUp</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">if</span> <span class="ow">not</span> <span class="n">disposed</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">disposed</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="nc">Shutdown</span><span class="o">(</span><span class="nn">SocketShutdown</span><span class="p">.</span><span class="nc">Both</span><span class="o">)</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="nc">Disconnect</span><span class="o">(</span><span class="bp">false</span><span class="o">)</span>
</span><span class='line'>            <span class="n">socket</span><span class="o">.</span><span class="nc">Close</span><span class="bp">()</span>
</span><span class='line'>            <span class="o">(</span><span class="n">sendPool</span> <span class="o">:&gt;</span> <span class="nc">IDisposable</span><span class="o">).</span><span class="nc">Dispose</span><span class="bp">()</span>
</span><span class='line'>            <span class="o">(</span><span class="n">receivePool</span> <span class="o">:&gt;</span> <span class="nc">IDisposable</span><span class="o">).</span><span class="nc">Dispose</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="n">socket</span><span class="o">.</span><span class="nc">ReceiveAsyncSafe</span><span class="o">(</span><span class="n">this</span><span class="o">.</span><span class="n">receiveCompleted</span><span class="o">,</span> <span class="n">receivePool</span><span class="o">.</span><span class="nc">CheckOut</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Stop</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="n">socket</span><span class="o">.</span><span class="nc">Close</span><span class="o">(</span><span class="mi">2</span><span class="o">)</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">receiveCompleted</span> <span class="o">(</span><span class="n">args</span><span class="o">:</span> <span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">try</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span> <span class="nn">SocketAsyncOperation</span><span class="p">.</span><span class="nc">Receive</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">SocketError</span> <span class="k">with</span>
</span><span class='line'>              <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">Success</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="n">socket</span><span class="o">.</span><span class="nc">ReceiveAsyncSafe</span><span class="o">(</span> <span class="n">this</span><span class="o">.</span><span class="n">receiveCompleted</span><span class="o">,</span> <span class="n">receivePool</span><span class="o">.</span><span class="nc">CheckOut</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">create</span> <span class="n">args</span><span class="o">.</span><span class="nc">BytesTransferred</span> <span class="mi">0</span><span class="n">uy</span>
</span><span class='line'>                <span class="nn">Buffer</span><span class="p">.</span><span class="nc">BlockCopy</span><span class="o">(</span><span class="n">args</span><span class="o">.</span><span class="nc">Buffer</span><span class="o">,</span> <span class="n">args</span><span class="o">.</span><span class="nc">Offset</span><span class="o">,</span> <span class="n">data</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">data</span><span class="o">.</span><span class="nc">Length</span><span class="o">)</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">client</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="nc">RemoteEndPoint</span>
</span><span class='line'>                <span class="n">args</span><span class="o">.</span><span class="nc">RemoteEndPoint</span> <span class="o">&lt;-</span> <span class="k">null</span>
</span><span class='line'>                <span class="n">data</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;received data: %A&quot;</span>
</span><span class='line'>              <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nn">SocketError</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;socket error on receive: %s&quot;</span>
</span><span class='line'>            <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failwith</span> <span class="s2">&quot;unknown operation, should be receive&quot;</span>
</span><span class='line'>          <span class="k">finally</span>
</span><span class='line'>            <span class="n">receivePool</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">args</span><span class="o">)</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">sendCompleted</span> <span class="o">(</span><span class="n">args</span><span class="o">:</span> <span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">try</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span> <span class="nn">SocketAsyncOperation</span><span class="p">.</span><span class="nc">Send</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">SocketError</span> <span class="k">with</span>
</span><span class='line'>              <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">Success</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span><span class='line'>              <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">NoBufferSpaceAvailable</span>
</span><span class='line'>              <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">IOPending</span>
</span><span class='line'>              <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">WouldBlock</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="k">if</span> <span class="ow">not</span><span class="o">(</span><span class="n">anyErrors</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>                  <span class="n">anyErrors</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>                  <span class="n">failwith</span> <span class="s2">&quot;Buffer overflow or send buffer timeout&quot;</span>
</span><span class='line'>              <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nn">SocketError</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;socket error on send: %s&quot;</span>
</span><span class='line'>            <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">failwith</span> <span class="s2">&quot;invalid operation, should be receive&quot;</span>
</span><span class='line'>          <span class="k">finally</span>
</span><span class='line'>            <span class="n">sendPool</span><span class="o">.</span><span class="nc">CheckIn</span><span class="o">(</span><span class="n">args</span><span class="o">)</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Send</span> <span class="o">(</span><span class="n">msg</span><span class="o">:</span><span class="kt">byte</span><span class="bp">[]</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">s</span> <span class="o">=</span> <span class="n">sendPool</span><span class="o">.</span><span class="nc">CheckOut</span><span class="bp">()</span>
</span><span class='line'>          <span class="nn">Buffer</span><span class="p">.</span><span class="nc">BlockCopy</span><span class="o">(</span><span class="n">msg</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="n">s</span><span class="o">.</span><span class="nc">Buffer</span><span class="o">,</span> <span class="n">s</span><span class="o">.</span><span class="nc">Offset</span><span class="o">,</span> <span class="n">msg</span><span class="o">.</span><span class="nc">Length</span><span class="o">)</span>
</span><span class='line'>          <span class="n">socket</span><span class="o">.</span><span class="nc">SendAsyncSafe</span><span class="o">(</span><span class="n">this</span><span class="o">.</span><span class="n">sendCompleted</span><span class="o">,</span> <span class="n">s</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally here&#8217;s the TcpListener type.  It is responsible for creating an
initial Connection object for each client and starts asynchronous sending
messages to that client once a second, also notice that there is another
BlockingCollection involved, this is somewhat simpler than the usage in the
bocketPool as we have no buffer to manage here.</p>

<ul>
<li><em>It is possible to fill the initial Buffer property, this causes the buffer to be sent to the client as soon as it has connected to the server, this can be useful to sent initial data to the client, such as protocol definitions etc)</em>
A finite number of connections can occur before blocking will occur depending
on the number of AsyncEventArgs in the collection, this stops potential denial
of service attacks due to too many connection being made.</li>
</ul>


<h3>TcpListener</h3>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'>    <span class="k">namespace</span> <span class="nc">Fes</span>
</span><span class='line'>      <span class="k">open</span> <span class="nc">System</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Net</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Net</span><span class="p">.</span><span class="nc">Sockets</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Generic</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nn">Collections</span><span class="p">.</span><span class="nc">Concurrent</span>
</span><span class='line'>      <span class="k">open</span> <span class="nn">System</span><span class="p">.</span><span class="nc">Threading</span>
</span><span class='line'>      <span class="k">open</span> <span class="nc">SocketExtensions</span>
</span><span class='line'>      <span class="k">type</span> <span class="nc">TcpListener</span><span class="o">(</span><span class="n">maxaccepts</span><span class="o">,</span> <span class="n">maxsends</span><span class="o">,</span> <span class="n">maxreceives</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">port</span><span class="o">,</span> <span class="n">backlog</span><span class="o">)</span> <span class="k">as</span> <span class="n">this</span> <span class="o">=</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">createTcpSocket</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">new</span> <span class="nc">Socket</span><span class="o">(</span><span class="nn">AddressFamily</span><span class="p">.</span><span class="nc">InterNetwork</span><span class="o">,</span> <span class="nn">SocketType</span><span class="p">.</span><span class="nc">Stream</span><span class="o">,</span> <span class="nn">ProtocolType</span><span class="p">.</span><span class="nc">Tcp</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">createListener</span> <span class="o">(</span><span class="n">ip</span><span class="o">:</span><span class="nc">IPAddress</span><span class="o">,</span> <span class="n">port</span><span class="o">,</span> <span class="n">backlog</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">s</span> <span class="o">=</span> <span class="n">createTcpSocket</span><span class="bp">()</span>
</span><span class='line'>          <span class="n">s</span><span class="o">.</span><span class="nc">Bind</span><span class="o">(</span><span class="k">new</span> <span class="nc">IPEndPoint</span><span class="o">(</span><span class="n">ip</span><span class="o">,</span> <span class="n">port</span><span class="o">))</span>
</span><span class='line'>          <span class="n">s</span><span class="o">.</span><span class="nc">Listen</span><span class="o">(</span><span class="n">backlog</span><span class="o">);</span> <span class="n">s</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">listeningSocket</span> <span class="o">=</span> <span class="n">createListener</span><span class="o">(</span> <span class="nn">IPAddress</span><span class="p">.</span><span class="nc">Loopback</span><span class="o">,</span> <span class="n">port</span><span class="o">,</span> <span class="n">backlog</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">initPool</span> <span class="o">(</span><span class="n">maxinpool</span><span class="o">,</span> <span class="n">callback</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">pool</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BlockingCollection</span><span class="o">&lt;</span><span class="nc">SocketAsyncEventArgs</span><span class="o">&gt;(</span><span class="n">maxinpool</span><span class="o">:</span><span class="kt">int</span><span class="o">)</span>
</span><span class='line'>          <span class="k">let</span> <span class="k">rec</span> <span class="n">loop</span> <span class="n">n</span> <span class="o">=</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">n</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span> <span class="n">x</span> <span class="k">when</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">maxinpool</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">let</span> <span class="n">saea</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SocketAsyncEventArgs</span><span class="bp">()</span>
</span><span class='line'>              <span class="n">saea</span><span class="o">.</span><span class="nc">Completed</span> <span class="o">|&gt;</span> <span class="nn">Observable</span><span class="p">.</span><span class="n">add</span> <span class="n">callback</span>
</span><span class='line'>              <span class="n">pool</span><span class="o">.</span><span class="nc">Add</span> <span class="n">saea</span>
</span><span class='line'>              <span class="n">loop</span> <span class="o">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="o">)</span>
</span><span class='line'>            <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="bp">()</span>
</span><span class='line'>          <span class="n">loop</span> <span class="mi">0</span>
</span><span class='line'>          <span class="n">pool</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">acceptPool</span> <span class="o">=</span> <span class="n">initPool</span> <span class="o">(</span><span class="n">maxaccepts</span><span class="o">,</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">newConnection</span> <span class="n">socket</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Connection</span> <span class="o">(</span><span class="n">maxreceives</span><span class="o">,</span> <span class="n">maxsends</span><span class="o">,</span> <span class="n">size</span><span class="o">,</span> <span class="n">socket</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">testMessage</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">init</span><span class="o">&lt;</span><span class="kt">byte</span><span class="o">&gt;</span> <span class="mi">128</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="mi">1</span><span class="n">uy</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">header</span> <span class="o">=</span> <span class="nn">Array</span><span class="p">.</span><span class="n">init</span><span class="o">&lt;</span><span class="kt">byte</span><span class="o">&gt;</span> <span class="mi">1</span> <span class="o">(</span><span class="k">fun</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="mi">1</span><span class="n">uy</span><span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">disposed</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>        <span class="c1">//mutable state from original</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">anyErrors</span> <span class="o">=</span> <span class="bp">false</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">requestCount</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>        <span class="k">let</span> <span class="k">mutable</span> <span class="n">numWritten</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>        <span class="c1">//async code from original</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">asyncWriteStockQuote</span><span class="o">(</span><span class="n">connection</span><span class="o">:</span><span class="nc">Connection</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>          <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">1000</span>
</span><span class='line'>          <span class="n">connection</span><span class="o">.</span><span class="nc">Send</span><span class="o">(</span><span class="n">testMessage</span><span class="o">)</span>
</span><span class='line'>          <span class="nn">Interlocked</span><span class="p">.</span><span class="nc">Increment</span><span class="o">(&amp;</span><span class="n">numWritten</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">ignore</span> <span class="o">}</span>
</span><span class='line'>        <span class="c1">//async code from original</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">asyncServiceClient</span> <span class="o">(</span><span class="n">client</span><span class="o">:</span> <span class="nc">Connection</span><span class="o">)</span> <span class="o">=</span> <span class="n">async</span> <span class="o">{</span>
</span><span class='line'>          <span class="n">client</span><span class="o">.</span><span class="nc">Send</span><span class="o">(</span><span class="n">header</span><span class="o">)</span>
</span><span class='line'>          <span class="k">while</span> <span class="bp">true</span> <span class="k">do</span>
</span><span class='line'>            <span class="k">do</span><span class="o">!</span> <span class="n">asyncWriteStockQuote</span><span class="o">(</span><span class="n">client</span><span class="o">)</span> <span class="o">}</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">startSending</span> <span class="n">connection</span> <span class="o">=</span>
</span><span class='line'>          <span class="nn">Async</span><span class="p">.</span><span class="nc">Start</span> <span class="o">(</span><span class="n">async</span> <span class="o">{</span>
</span><span class='line'>            <span class="k">try</span>
</span><span class='line'>              <span class="k">use</span> <span class="o">_</span><span class="n">holder</span> <span class="o">=</span> <span class="n">connection</span>
</span><span class='line'>              <span class="k">do</span><span class="o">!</span> <span class="n">asyncServiceClient</span> <span class="n">connection</span>
</span><span class='line'>            <span class="k">with</span> <span class="n">e</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">if</span> <span class="ow">not</span><span class="o">(</span><span class="n">anyErrors</span><span class="o">)</span> <span class="k">then</span>
</span><span class='line'>                <span class="n">anyErrors</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>                <span class="nn">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="o">(</span><span class="s2">&quot;server ERROR&quot;</span><span class="o">)</span>
</span><span class='line'>              <span class="n">raise</span> <span class="n">e</span>
</span><span class='line'>            <span class="o">}</span> <span class="o">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">reportConnections</span> <span class="o">=</span>
</span><span class='line'>          <span class="nn">Interlocked</span><span class="p">.</span><span class="nc">Increment</span><span class="o">(&amp;</span><span class="n">requestCount</span><span class="o">)</span> <span class="o">|&gt;</span> <span class="n">ignore</span>
</span><span class='line'>          <span class="k">if</span> <span class="n">requestCount</span> <span class="o">%</span> <span class="mi">1000</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">requestCount</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;%A Clients accepted&quot;</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">cleanUp</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">if</span> <span class="ow">not</span> <span class="n">disposed</span> <span class="k">then</span>
</span><span class='line'>            <span class="n">disposed</span> <span class="o">&lt;-</span> <span class="bp">true</span>
</span><span class='line'>            <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">Shutdown</span><span class="o">(</span><span class="nn">SocketShutdown</span><span class="p">.</span><span class="nc">Both</span><span class="o">)</span>
</span><span class='line'>            <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">Disconnect</span><span class="o">(</span><span class="bp">false</span><span class="o">)</span>
</span><span class='line'>            <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">Close</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span> <span class="o">(</span><span class="n">args</span> <span class="o">:</span> <span class="nc">SocketAsyncEventArgs</span><span class="o">)</span> <span class="o">=</span>
</span><span class='line'>          <span class="k">try</span>
</span><span class='line'>            <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="k">with</span>
</span><span class='line'>            <span class="o">|</span> <span class="nn">SocketAsyncOperation</span><span class="p">.</span><span class="nc">Accept</span> <span class="o">-&gt;</span>
</span><span class='line'>              <span class="k">match</span> <span class="n">args</span><span class="o">.</span><span class="nc">SocketError</span> <span class="k">with</span>
</span><span class='line'>              <span class="o">|</span> <span class="nn">SocketError</span><span class="p">.</span><span class="nc">Success</span> <span class="o">-&gt;</span>
</span><span class='line'>                <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">AcceptAsyncSafe</span><span class="o">(</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span><span class="o">,</span> <span class="n">acceptPool</span><span class="o">.</span><span class="nc">Take</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>                <span class="c1">//create new connection</span>
</span><span class='line'>                <span class="k">let</span> <span class="n">connection</span> <span class="o">=</span> <span class="n">newConnection</span> <span class="n">args</span><span class="o">.</span><span class="nc">AcceptSocket</span>
</span><span class='line'>                <span class="n">connection</span><span class="o">.</span><span class="nc">Start</span><span class="bp">()</span>
</span><span class='line'>                <span class="c1">//update stats</span>
</span><span class='line'>                <span class="n">reportConnections</span>
</span><span class='line'>                <span class="c1">//async start of messages to client</span>
</span><span class='line'>                <span class="n">startSending</span> <span class="n">connection</span>
</span><span class='line'>                <span class="c1">//remove the AcceptSocket because we will be reusing args</span>
</span><span class='line'>                <span class="n">args</span><span class="o">.</span><span class="nc">AcceptSocket</span> <span class="o">&lt;-</span> <span class="k">null</span>
</span><span class='line'>              <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nn">SocketError</span><span class="p">.</span><span class="nc">ToString</span><span class="bp">()</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;socket error on accept: %s&quot;</span>
</span><span class='line'>            <span class="o">|</span> <span class="o">_</span> <span class="o">-&gt;</span> <span class="n">args</span><span class="o">.</span><span class="nc">LastOperation</span> <span class="o">|&gt;</span> <span class="n">failwith</span> <span class="s2">&quot;Unknown operation, should be accept but was %a&quot;</span>
</span><span class='line'>          <span class="k">finally</span>
</span><span class='line'>            <span class="n">acceptPool</span><span class="o">.</span><span class="nc">Add</span><span class="o">(</span><span class="n">args</span><span class="o">)</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="n">start</span> <span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="n">listeningSocket</span><span class="o">.</span><span class="nc">AcceptAsyncSafe</span><span class="o">(</span> <span class="n">this</span><span class="o">.</span><span class="n">acceptcompleted</span><span class="o">,</span> <span class="n">acceptPool</span><span class="o">.</span><span class="nc">Take</span><span class="bp">()</span><span class="o">)</span>
</span><span class='line'>          <span class="k">while</span> <span class="bp">true</span> <span class="k">do</span>
</span><span class='line'>          <span class="nn">Thread</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">1000</span>
</span><span class='line'>          <span class="k">let</span> <span class="n">count</span> <span class="o">=</span> <span class="nn">Interlocked</span><span class="p">.</span><span class="nc">Exchange</span><span class="o">(&amp;</span><span class="n">numWritten</span><span class="o">,</span> <span class="mi">0</span><span class="o">)</span>
</span><span class='line'>          <span class="n">count</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">&quot;Quotes per sec: %A&quot;</span>
</span><span class='line'>        <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Close</span><span class="bp">()</span> <span class="o">=</span>
</span><span class='line'>          <span class="n">cleanUp</span><span class="bp">()</span>
</span><span class='line'>        <span class="k">interface</span> <span class="nc">IDisposable</span> <span class="k">with</span>
</span><span class='line'>          <span class="k">member</span> <span class="n">this</span><span class="o">.</span><span class="nc">Dispose</span><span class="bp">()</span> <span class="o">=</span> <span class="n">cleanUp</span><span class="bp">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Its a fair bit of code to take in at once, so Ill leave you with it to ponder
over.  Ill be explaining all of the interesting bits in more detail in part
three&#8230;</p>

<p>Please feel free to leave any comments you have, especially on better use of
functional constructs.</p>
]]></content>
  </entry>
  
</feed>

