[erlang-questions] Re: testing asynchronous code

Jay Nelson jay@REDACTED
Thu Apr 22 06:16:50 CEST 2010


>> You're right, the cast call spawns a process with a single call to
>> erlang:send/2, but that process may not get a chance to run before
>> the initializing process makes a gen_server:call.
> That's not my reading of the gen_server code at all.  The do_send()
> function (which is what ultimately does the erlang:send() of the
> message) /only/ spawns a new function if erlang:send() returns
> 'noconnect', and that will only happen (if my understanding is  
> correct)
> if the process in question resides on a currently unconnected  
> node.  In
> the case of the example code given, that's not going to be the case
> since the gen_server was started by the same process doing the  
> cast, and
> therefore even if it was started on a remote node we must already be
> connected to that node.

You _read_ the code, while I just glanced at it to double-check if  
was providing misleading information.  Your reading is correct, the  
sight of the spawn just gave me a spasm of remorse and I retracted  
too quickly.

Thankfully, my old code is correct and it is safe to cast directly  
after receiving the Pid from init, before returning it to the caller.

>
> To address the earlier question that lead to this, my understanding is
> that if you have the following message sending:
>
> A -> B
> A -> C
> C -> B (dependant on message from A)
>
> then the message from A to B /is/ guaranteed to arrive before the
> message from C.  Feel free to correct me on that though.

That is correct.  And I am going to step off this thread before I  
create any more misleading asides.

jay



More information about the erlang-questions mailing list