<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p><b style="font-size: 11pt; font-family: Calibri, sans-serif;">From:</b><span style="font-size: 11pt; font-family: Calibri, sans-serif;"> Joe Armstrong <erlang@gmail.com></span></p>
</div>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);">
<div>
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>Sent:</b> Thursday, January 26, 2017 5:29 AM</font></div>
</div>
</div>
</div>
</blockquote>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);">
<div>
<div id="x_divRplyFwdMsg" dir="ltr">
<div> </div>
</div>
</div>
</div>
</div>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">On Wed, Jan 25, 2017 at 12:38 AM, Dmitry Kakurin</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText"><dima_kakurin@hotmail.com> wrote:</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> When I execute "pid ! msg" and it returns, what are the guarantees if pid</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> and self are on the same node?</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> Can I assume that by the time it returns, msg is in the pid's queue? And as</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> a result all messages sent to pid afterwards will be queued after msg?</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">></div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> The reason I'm asking is because I need a guarantee of proper message</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> ordering in the following scenario when all processes involved are local to</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> a node:</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> 1. A --msg1--> C (process A sends msg1 to process C)</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> 2. A --msg2--> B</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> 3. B --msg2--> C (process B simply proxies msg2 from A to C)</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">></div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">> I need a guarantee that msg2 will always appear in C's queue after msg1.</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText"><br>
</div>
</span></font></div>
</div>
<div style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<div style="color: rgb(0, 0, 0);"><font size="2"><span style="font-size:10pt;">
<div class="PlainText">This cannot be guaranteed</div>
</span></font></div>
</div>
</blockquote>
<div dir="ltr">
<div><font>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 10pt;">
<br>
</div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 10pt;">
<span style="font-size: 11pt;">Thanks Joe and others. I understand now that it's fruitless to pursue a direction where I'd try to somehow artificially establish this guarantee.</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 10pt;">
<span style="font-size: 11pt;"><br>
</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;">I have to re-evaluate my constraints then. All along my main constraint was that C can be any gen_server, it's not owned by me and I cannot change it.</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;">If I could change C then the following would work:</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;">1. A --msg1--> C</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;">2. A --ping--> C</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;">3. A <--pong-- C</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;">
<div>4. A --msg2--> B</div>
<div>5. B --msg2--> C</div>
<div><br>
</div>
<div>All we need from C is to respond "pong" to "ping" message. <span style="font-size: 14.6667px;">In this case A knows msg2 is enqueued </span><span style="font-size: 14.6667px;">after msg1
</span><span style="font-size: 14.6667px;">because A has observed "pong" in response to </span><span style="font-size: 14.6667px;">"ping" that was sent after msg1</span><span style="font-size: 14.6667px;">. The ordering is as desired here.</span></div>
<div>Now the only problem I have to solve is: what can be used as a benign message that I can send to any gen_server such that it would reply (to emulate ping/pong exchange above)?</div>
<div>Looking thru gen_server source code I see that it's processing sys messages. So I can use get_state message as "ping" and response with state as "pong". Except it may not be really benign perf-wise if amount of state kept by C is significant.</div>
<div>There is also get_status, but I don't understand how it's processed and if I can use it for ping/pong purposes. Can I? Is there a better message?</div>
<div><br>
</div>
<div>Do you have a better idea for ping/pong messages on C? Or how to solve this in <span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 14.6667px;">general</span>?</div>
</span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 11pt;"><br>
</span></span></div>
<div class="PlainText" style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif;">
<span style="font-size: 14.6667px;"><span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 11pt;">Thank you, Dmitry.</span><br style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 16px;">
<br>
</span></div>
<div class="PlainText"><font face="Calibri, Arial, Helvetica, sans-serif"><span style="font-size: 14.6667px;">P.S. I know that in this simplified example I could piggyback on msg1 if it returns something but in real code I cannot, so let's assume it's a one-way
 message (a cast, not a call). So I'm OK with ping/pong.</span></font><br>
<br>
</div>
</font></div>
</div>
</div>
</body>
</html>