<div dir="ltr">Fred,<div><br></div><div><span style="font-size:12.8000001907349px">The Elixir solution conveniently ignores that possibility in await() and therefore risks leaking messages (that will remain stuck in the process mailbox).</span></div><div><br></div><div>You are right, the Elixir implementation actually breaks when any receive block that consumes all messages off the queue is placed in-between the async and await calls.</div><div><br></div><div>I submitted an issue.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr">Abejide Ayodele<br><span style="color:rgb(85,85,85);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:22px">It always seems impossible until it's done. --Nelson Mandela</span><br></div></div></div>
<br><div class="gmail_quote">On Fri, Apr 3, 2015 at 1:30 PM, Fred Hebert <span dir="ltr"><<a href="mailto:mononcqc@ferd.ca" target="_blank">mononcqc@ferd.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 04/03, ayodele abejide wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
There is anĀ  implementation of Future/Promise in Elixir its called Task[1]<br>
</blockquote>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Reading the source[2] Task is a wrapper around proc_lib that monitors the<br>
calling process for error handling and uses patterns described by Joe in<br>
its implementation. Understanding the primitives would make implementing<br>
something similar in Erlang trivial<br>
<br>
<a href="https://github.com/elixir-lang/elixir/blob/v1.0.3/lib/elixir/lib/task.ex#L146-L209" target="_blank">https://github.com/elixir-<u></u>lang/elixir/blob/v1.0.3/lib/<u></u>elixir/lib/task.ex#L146-L209</a><br>
</blockquote>
<br>
Interestingly enough, this shows these patterns are harder to implement correctly than it seems. Looking at the code, if the caller process is trapping exits (process_flag(trap_exit, true)), then the caller won't only receive the 'DOWN' message sent by the monitor, but also an 'EXIT' tuple. If the `await` function is wrapped in a `catch`, then the message won't be handled properly.<br>
<br>
The Elixir solution conveniently ignores that possibility in await() and therefore risks leaking messages (that will remain stuck in the process mailbox).<br>
<br>
The Erlang RPC mechanism handles that one properly by spawning [1] a middle-man process to handle these failures [2].<br>
<br>
[1]: <a href="https://github.com/erlang/otp/blob/maint/lib/kernel/src/rpc.erl#L629-L649" target="_blank">https://github.com/erlang/otp/<u></u>blob/maint/lib/kernel/src/rpc.<u></u>erl#L629-L649</a><br>
[2]: <a href="https://github.com/erlang/otp/blob/maint/lib/kernel/src/rpc.erl#L328-L361" target="_blank">https://github.com/erlang/otp/<u></u>blob/maint/lib/kernel/src/rpc.<u></u>erl#L328-L361</a><br>
<br>
The basic pattern is simple enough, but fault-tolerance is often trickier than one expects it to be.<br>
<br>
Regards,<br>
Fred.<br>
</blockquote></div><br></div>