spawn without linking?

Sean Hinde <>
Mon Apr 26 23:14:58 CEST 2004


On 26 Apr 2004, at 19:19, Ulf Wiger wrote:

> On Mon, 26 Apr 2004 14:56:01 +0200 (CEST), Joe Armstrong <> 
> wrote:
>
>> On Thu, 22 Apr 2004, Sean Hinde wrote:
>
>>> How about this which I had fun writing today. It is almost Erlangish,
>>> and it is something like OTP, and it is exactly Joe's selective 
>>> receive
>>> example. I can't decide whether it is ugly or profoundly beautiful.
>>
>> It is of course profoundly beautiful, but the syntax obscures the 
>> beauty.
>>
>> Just overload the LHS of !! so you can write
>>
>> 	[A,B,C] !! M
>>
>> This means send M to three processes (machines or whatever's) and
>> gather three replies yielding [V1,V2,V3]
>
> Ah, but Joe, you changed the semantics. Sean had a timeout argument,
> which you don't.  ;-)
>
> BTW, Sean, you should rethink the implementation of the timeout.
> I think it's better to start a timer and handle a timeout message.
> In your present implementation, the "timer" will restart anytime
> one of the servers responds, making it fuzzy what the timeout
> really means.

That was something like my first thought, but I was persuaded to do it 
like it is. I agree, I'll re-write it, thanks.

Sean

>
> Regards,
> Uffe
>
>
>>> %% Call a bunch of gen_servers with different requests in
>>> %% parallel and return successes and failures. Any which
>>> %% fail to answer within Timeout ms are included as failures.
>>>
>>> %% We require that the calling process will continue to ignore
>>> %% late answers
>>>
>>> multi_call(Requests, Timeout) ->
>>>      Mrefs = lists:map(
>>>                fun({Name, Req}) ->
>>>                        Mref = erlang:monitor(process, Name),
>>>                        Name ! {'$gen_call', {self(), Mref}, Req},
>>>                        {Name, Mref}
>>>                end, Requests),
>>>      get_results(Mrefs, [], [], Timeout, now()).
>>>
>>> get_results([{Name, Mref}|T], Succ, Fail, Timeout, Now_at_start) ->
>>>      Timeout_val = max(Timeout - (timer:now_diff(now(), Now_at_start)
>>> div 1000), 0),
>>>      receive
>>>          {Mref, Reply} ->
>>>              erlang:demonitor(Mref),
>>>              receive
>>>                  {'DOWN', Mref, _, _, _} ->
>>>                      get_results(T, [{Name, Reply}|Succ], Fail, 
>>> Timeout,
>>> Now_at_start)
>>>              after 0 ->
>>>                      get_results(T, [{Name, Reply}|Succ], Fail, 
>>> Timeout,
>>> Now_at_start)
>>>              end;
>>>          {'DOWN', Mref, _, _, _} ->
>>>              get_results(T, Succ, [Name|Fail], Timeout, Now_at_start)
>>>      after Timeout_val ->
>>>              erlang:demonitor(Mref),
>>>              get_results(T, Succ, [Name|Fail], Timeout, Now_at_start)
>>>      end;
>>> get_results([], Succ, Fail, _, _) ->
>>>      {Succ, Fail}.
>>>
>>> max(A, B) when A >= B -> A;
>>> max(A, B)             -> B.
>>>
>>
>
>
>
> -- 
> Ulf Wiger
>




More information about the erlang-questions mailing list