<br>Hello,<br><br>I have server that spawns a new 'handler' process/function for every incoming socket.<br><br>Those 'handler' process must communicate with the server process. I am wondering which of the two following solutions is best.
<br><br><div style="margin-left: 40px;">1. Should the server process register itself with the server atom, as in:</div><div style="margin-left: 80px;"><span style="font-family: courier new,monospace;"><br><span style="font-weight: bold;">
start</span>() -><br>    [...]<br>    register(server, spawn(test, </span><span style="font-family: courier new,monospace;"><span style="font-weight: bold;">server_loop</span></span><span style="font-family: courier new,monospace;">
, [LSock])).<br><br><span style="font-weight: bold;">server_loop</span>(LSock) -></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    case gen_tcp:accept(LSock, 1000) of
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        {ok, Socket} -></span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">            [...]</span><span style="font-family: courier new,monospace;"><br>            Client_Pid = </span><span style="font-family: courier new,monospace;">spawn(?MODULE, 
<span style="font-weight: bold;">relay</span>, [Socket]),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            gen_tcp:controlling_process(Socket, Client_Pid),
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            </span><span style="font-family: courier new,monospace;"><span style="font-weight: bold;">server_loop</span>
</span><span style="font-family: courier new,monospace;">(LSock);<br><br style="font-family: courier new,monospace;"></span><span style="font-family: courier new,monospace;">        [...]</span><span style="font-family: courier new,monospace;">
</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    end.<br><br><span style="font-weight: bold;">relay</span>(Socket) -><br>    receive<br>        {tcp, Socket, Bin} ->
<br>            Data = binary_to_list(Bin),<br>            server ! {self(), Data},<br>            ?MODULE:<span style="font-weight: bold;">relay</span>(Socket);<br><br>        [...]<br>    end.<br><br></span></div><div style="margin-left: 40px;">
<br>2. Should I pass the server's pid as an argument to the client loop, such as:<br><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;"><br>
<span style="font-weight: bold;">start</span>() -><br>
    [...]<br>
    spawn(test, </span><span style="font-family: courier new,monospace;"><span style="font-weight: bold;">server_loop</span></span><span style="font-family: courier new,monospace;">, [LSock]).<br>
<br>
<span style="font-weight: bold;">server_loop</span>(LSock) -></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    case gen_tcp:accept(LSock, 1000) of</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">        {ok, Socket} -></span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">            [...]</span><span style="font-family: courier new,monospace;"><br>
            Client_Pid = </span><span style="font-family: courier new,monospace;">spawn(?MODULE, <span style="font-weight: bold;">relay</span>, [Socket, self()]),</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">            gen_tcp:controlling_process(Socket, Client_Pid),</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">            </span><span style="font-family: courier new,monospace;"><span style="font-weight: bold;">server_loop</span></span><span style="font-family: courier new,monospace;">
(LSock);<br>
<br style="font-family: courier new,monospace;">
</span><span style="font-family: courier new,monospace;">        [...]</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    end.<br>
<br>
<span style="font-weight: bold;">relay</span>(Socket, Server) -><br>
    receive<br>
        {tcp, Socket, Bin} -><br>
            Data = binary_to_list(Bin),<br>
            Server ! {self(), Data},<br>
            ?MODULE:<span style="font-weight: bold;">relay</span>(Socket, Server);<br>
<br>
        [...]<br>
    end.</span></div><br></div><br>Or rather, I realize this question is on a per-case basis mostly ... so really, what I would like to ask, is whether there are any side-effects to doing it the second way (by passing an argument). Is the overhead for an extra argument on a loop function like that big?
<br><br>Thanks,<br><br>Jérémie Lumbroso<br>