<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">In 2004 we had this discussion, maybe something in here ?<div><br></div><div><pre style="word-wrap: break-word; white-space: pre-wrap;"><blockquote type="cite">From tony  Tue Feb 24 15:11:46 2004
From: tony (Tony Rogvall)
Date: Tue, 24 Feb 2004 15:11:46 +0100
Subject: Higher order receieve anybody
In-Reply-To: <<a href="mailto:opr3u9em0w1p4575@se-smtp.ericsson.se">opr3u9em0w1p4575@se-smtp.ericsson.se</a>>
Message-ID: <<a href="mailto:614367EC-66D3-11D8-AE38-000A95EB4F88@rogvall.com">614367EC-66D3-11D8-AE38-000A95EB4F88@rogvall.com</a>>


On Tuesday, Feb 24, 2004, at 09:48 Europe/Stockholm, Ulf Wiger wrote:
>
> I would like to see the possibility to divide messages into
> two separate categories: administrative (such as suspend,
> resume, inspect, upgrade) and operative (whatever the program
> is _really_ supposed to do. And I would like to be able to keep
> them separated without messing up the programming semantics.

One idea (tested and implemented) is to use a primitive 
erlang:signal(Pid,Sig, Info) to send
a primitive form of messages.  For example message passing could be 
implemented as
erlang:signal(Pid, 'MESSAGE', Message). In Multi Pro Erlang we did the 
signal dispatcher in C code.
In retrospect we should have implemented a signal dispatcher / 
signal_handler in Erlang. This way
all signals (including messages) would be processed by Erlang code. 
Then one could implement
the link semantics and message reception etc in Erlang code!
The signal handler should be called in the context of the receiving 
process with some kind of
interrupt semantics (when it comes to receive).


-module(signal_handler).
-export([handle_signal/3]).

handle_signal(From, 'MESSAGE', Message) ->
        erlang:queue_message(Message);
handle_signal(From, 'LINK', _) ->
          erlang:add_link(From);
...
        

/Tony
</blockquote></pre><div><br></div><div>/Tony (2014 :-)</div><div><br></div><div><br></div><div><div>On 28 sep 2014, at 15:13, Fred Hebert <<a href="mailto:mononcqc@ferd.ca">mononcqc@ferd.ca</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Nitpicks:<br><br>On 09/27, Marcin Sokolowski wrote:<br><blockquote type="cite">2) gen_server:call is blocking which is perfectly fine, selective receive<br>that is happening behind the scenes is not.<br><br></blockquote><br>It rarely happens anymore. An optimization has been added since R14A for<br>this (and in 17.3 for HiPE).<br><br>To make it work, a reference (make_ref()) has to be created in a<br>function and then sent in a message. In the same function, a selective<br>receive is then made. If no message can match unless it contains the<br>same reference, the compiler automatically makes sure the VM will skip<br>messages received before the creation of that reference.<br><br>Therefore, the selective receive ignores all messages that came before<br>the reference was generated, including to set up the monitor there, and<br>the call is efficient.<br><br><blockquote type="cite"> == Sending ==<br><br> I propose following syntax for sending signals<br><br></blockquote><br>The 'signal' term is already used for EXIT messages, for example, which<br>can be trapped with process_flag(trap_exit, true). If you intend on<br>creating a new class of messages, 'signal' is already used.<br><br><blockquote type="cite"> 1) Any message that is send to a process that is expecting that message<br>doing selective receive should be send as signal. All gen_server:call<br>responses should be signals so selective receive can be avoided<br><br></blockquote><br>This is no longer required. It depends, though, because you did mention<br>having a second TCP connection to handle these. This would change, but<br>not sure what the benefit would be at high volume; you could juts be<br>clogging up the signal line with all the responses.<br><br><blockquote type="cite"> 2) Any operational type of messages that are sent to control behaviour of<br>the process should be sent as signals. For processes handling large number<br>of messages it is not possible to control process quickly enough - control<br>message might arrive way to late.<br><br></blockquote><br>Ah, this is the fun one. Currently, Erlang processes and messages have a<br>property such that all messages and signals sent by process A to process<br>B will arrive in order.<br><br>This means that if I'm writing a monitoring server that receives<br>different types of messages:<br><br>- {lock, Pid, Resource}: Pid locks Resource<br>- {read, Pid, Resource}: Pid fetches the value of the resource<br>- {write, Pid, Resource, NewVal}: Pid modifies the resource<br>- {free, Pid, Resource}: Pid frees the lock it has on Resource<br>- {'EXIT', Pid, Reason}: Pid is dead, release all of its Resources<br><br>If I receive {'EXIT', Pid, _}, I know the process is dead for good and no<br>further requests will happen. I can drop the local state attached to<br>Pid, freeing all resources.<br><br>So if I try, in order, to do lock -> write -> free -> lock again -><br>write again, and then die, I will see the sequence of events:<br><br>{lock, Pid, Resource} -> {write, Pid, Resource, NewVal} -> {free, Pid, Resource} -><br>{lock, Pid, Resource} -> {write, Pid, Resource, NewVal} -> {'EXIT', Pid, Reason}<br><br>Which is fine and easy to reason about.<br><br>Under the new scheme, and assuming {'EXIT', Pid, _} comes back in as a<br>'signal', I need to care for the following possible ordering:<br><br>{lock, Pid, Resource} -> {'EXIT', Pid, Reason} -> {write, Pid, Resource, NewVal} -><br>{free, Pid, Resource} -> {lock, Pid, Resource} -> {write, Pid, Resource, NewVal}<br><br>The one that hurts here is the last 'lock' and its followup 'write'.<br>Assuming I'm writing my code properly, I should get a new 'EXIT' message<br>somewhere after registration. So these 2 interleavings are possible:<br><br>{lock, Pid, Resource} -> {'EXIT', Pid, Reason} -> {write, Pid, Resource, NewVal} -><br>{free, Pid, Resource} -> {lock, Pid, Resource} -> {'EXIT', Pid, Reason} -> {write, Pid, Resource, NewVal}<br><br>Which is fine, but there is also:<br><br>{lock, Pid, Resource} -> {'EXIT', Pid, Reason} -> {write, Pid, Resource, NewVal} -><br>{free, Pid, Resource} -> {lock, Pid, Resource} -> {write, Pid, Resource, NewVal} -> {'EXIT', Pid, Reason}<br><br>And in fact, because they're two different channels with different busy<br>levels, those are all also few of the possibilities:<br><br>{lock, Pid, Resource} -> {write, Pid, Resource, NewVal} -> {'EXIT', Pid, Reason} -><br>{free, Pid, Resource} -> {lock, Pid, Resource} -> {write, Pid, Resource, NewVal} -> {'EXIT', Pid, Reason}<br><br>{lock, Pid, Resource} -> {write, Pid, Resource, NewVal} -> {'EXIT', Pid, Reason} -><br>{free, Pid, Resource} -> {lock, Pid, Resource} -> {'EXIT', Pid, Reason} -> {write, Pid, Resource, NewVal}<br><br>Because I'm using a concurrent system that may or may not be<br>distributed, there is no longer any guarantee that the order I get is<br>any good or representative of reality.<br><br>This makes systems a lot harder to reason about, and would likely break<br>existing systems. Raise any of your messages to the 'signal' level (even<br>if you leave exits out of it) and the same problem happens.<br><br>Mind you, this problem already partially exists today if you build a<br>system such that:<br><br>A <----- B <--,<br>  <----- C ---'<br><br>Where A can receive messages from C directly, and from C through B, but<br>these are rarely seen in the wild, and C and B risk being seen as two<br>different entities, or a bug in design that needs to be (and can be) rectified.<br><br><blockquote type="cite">1) requiring processes to acquire "special permission" to send signals,<br>without it signals would be just simple messages<br><br></blockquote><br>Wouldn't acquiring special permissions on the receiver make more sense?<br><br><blockquote type="cite">3) limiting the type of messages that could be sent as signals (e.g. atoms<br>only)<br><br></blockquote>This would mean impossibility to know who sent you a message<br><br>I've skipped over the implementation details because the semantic ones<br>seem more important to think about at this point, including one of the<br>two main rationale points no longer being a problem via compiler<br>optimizations.<br><br>Regards,<br>Fred.<br>_______________________________________________<br>eeps mailing list<br><a href="mailto:eeps@erlang.org">eeps@erlang.org</a><br>http://erlang.org/mailman/listinfo/eeps<br></blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px;"><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; ">"Installing applications can lead to corruption over time. </span><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; ">Applications gradually write over each other's libraries, partial upgrades occur, user and system errors happen, and minute changes may be unnoticeable and difficult to fix"</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; "><br></span></div></span><br class="Apple-interchange-newline">
</div>
<br></div></body></html>