diff options
| author | Matthias Radestock <matthias@rabbitmq.com> | 2014-01-29 12:57:28 +0000 |
|---|---|---|
| committer | Matthias Radestock <matthias@rabbitmq.com> | 2014-01-29 12:57:28 +0000 |
| commit | 02f0f4361853dfe32627f2be5a5a0b0b8596f0a2 (patch) | |
| tree | d330c72c3870b991fddf0192961e0bb3b05f270b | |
| parent | 9b52df5430c042492fea8fe84d97d36293dbccf5 (diff) | |
| download | rabbitmq-server-git-02f0f4361853dfe32627f2be5a5a0b0b8596f0a2.tar.gz | |
refactor: simplify
| -rw-r--r-- | src/gen_server2.erl | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/gen_server2.erl b/src/gen_server2.erl index f0748c2020..f0328c5323 100644 --- a/src/gen_server2.erl +++ b/src/gen_server2.erl @@ -413,8 +413,10 @@ mcall(CallSpecs) -> Tag = make_ref(), {_, MRef} = spawn_monitor( fun() -> - Refs = lists:foldl(fun do_mcall/2, dict:new(), - CallSpecs), + Refs = lists:foldl( + fun ({Dest, _Request}=S, Dict) -> + dict:store(do_mcall(S), Dest, Dict) + end, dict:new(), CallSpecs), collect_replies(Tag, Refs, [], []) end), receive @@ -422,29 +424,28 @@ mcall(CallSpecs) -> {'DOWN', MRef, _, _, Reason} -> exit(Reason) end. -do_mcall({{global,Name}=Dest, Request}, Dict) -> +do_mcall({{global,Name}=Dest, Request}) -> %% whereis_name is simply an ets lookup, and is precisely what %% global:send/2 does, yet we need a Ref to put in the call to the %% server, so invoking whereis_name makes a lot more sense here. - GRef = case global:whereis_name(Name) of - Pid when is_pid(Pid) -> - MRef = erlang:monitor(process, Pid), - catch msend(Pid, MRef, Request), - MRef; - undefined -> - Ref = make_ref(), - self() ! {'DOWN', Ref, process, Dest, noproc}, - Ref - end, - dict:store(GRef, Dest, Dict); -do_mcall({{Name,Node}=Dest, Request}, Dict) when is_atom(Name), is_atom(Node) -> - {_Node, MRef} = start_monitor(Node, Name), + case global:whereis_name(Name) of + Pid when is_pid(Pid) -> + MRef = erlang:monitor(process, Pid), + catch msend(Pid, MRef, Request), + MRef; + undefined -> + Ref = make_ref(), + self() ! {'DOWN', Ref, process, Dest, noproc}, + Ref + end; +do_mcall({{Name,Node}=Dest, Request}) when is_atom(Name), is_atom(Node) -> + {_Node, MRef} = start_monitor(Node, Name), %% NB: we don't handle R6 catch msend(Dest, MRef, Request), - dict:store(MRef, Dest, Dict); -do_mcall({Dest, Request}, Dict) when is_atom(Dest); is_pid(Dest) -> + MRef; +do_mcall({Dest, Request}) when is_atom(Dest); is_pid(Dest) -> MRef = erlang:monitor(process, Dest), catch msend(Dest, MRef, Request), - dict:store(MRef, Dest, Dict). + MRef. msend(Dest, MRef, Request) -> erlang:send(Dest, {'$gen_call', {self(), MRef}, Request}, [noconnect]). |
