<div>Hi Mikael,</div><div><br></div><div>Thank you for the hint about rpc module. I'll try to read it to understand its behaviour</div><div><br></div><div>I'm still considering myself an Erlang newbie.</div><div><br></div><div>The idea here is to log all calls to my gen_server for debugging purposes: who called me, from where, when, with which arguments ...</div><div><br></div><div>For "handle_call", it's more or less easy. Not so for "handle_cast" and "handle_info".</div><div><br></div><div>Finally, I would like to generalize this idea to more than one gen_server. It'll be very tedious if I've to add log calls to every gen_server in my app. Maybe there's a better way. </div><div><br></div><div>Thanks again for your time Mikael.</div><div><br></div><div>/Frank</div><div><br></div><div><<a href="mailto:mikpelinux@gmail.com">mikpelinux@gmail.com</a>> wrote :<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Frank Muller writes:<br>
 > Hi guys,<br>
 ><br>
 > I've two connected nodes: N1, N2.<br>
 ><br>
 > N1 is mine and I've a gen_server running on it.<br>
 > N2 is external and doesn't belong to me.<br>
 ><br>
 > A process on N2 is calling my gen_server (on N1) via an rpc:call.<br>
 ><br>
 > Is there a way to know the Pid of that process?<br>
<br>
Based on a half hour study of lib/kernel/src/rpc.erl in OTP-19.3 I didn't<br>
think so, but now I think I may have found a way.<br>
<br>
On the callee node, rpc has a gen_server (rex) which handles incoming calls.<br>
When it calls the {Mod,Fun,Args} from the rpc:call, it does so asynchronously<br>
via a temporary process (see handle_call_call/6).  There is a mapping from<br>
that process' Pid to the From passed to rex' handle_call (called 'To' in the code)<br>
in rex' state, which you could dig out using sys:get_state or :get_status.<br>
<br>
But on the caller node, rpc:call also uses a temporary process when doing the<br>
gen_server:call to the callee node (see do_call/3), and the only association<br>
between that process and the application process doing the rpc:call is buried<br>
in the local variables of do_call/3 and the temporary process.  (So if you do<br>
the sys:get_state on the callee node, you'd end up with the Pid of the temporary<br>
process on the caller node.)<br>
<br>
... but now it struck me that the temporary process is monitored by the process<br>
doing the rpc:call, which erlang:process_info(Pid, monitored_by) should be able<br>
to retrieve.  So a reverse rpc:call to the caller node to do that could work.<br>
<br>
Not tested, will break if the rpc implementation changes, etc.<br>
<br>
Why do you need this anyway?<br>
<br>
 > Or, can I log all rpc_call(s) calling my gen_server?<br>
<br>
rex doesn't have that built-in, but you could modify it to do so (it's on the<br>
node you control)<br>
<br>
/Mikael<br>
</blockquote></div></div>