summaryrefslogtreecommitdiff
path: root/src/delegate.erl
diff options
context:
space:
mode:
authorTim Watson <tim@rabbitmq.com>2013-05-16 12:13:19 +0100
committerTim Watson <tim@rabbitmq.com>2013-05-16 12:13:19 +0100
commit97494a765a8bef90b202357f04d96e4b39cc255e (patch)
treea1781c38e8073b2fff247e0589bace6e79171a63 /src/delegate.erl
parent08877efa78ca44cb0324d1d4242e01d4dab92933 (diff)
parentffeb160eda7a99d5d8935d1b2f90798a39782c13 (diff)
downloadrabbitmq-server-git-97494a765a8bef90b202357f04d96e4b39cc255e.tar.gz
merge bug25537 into stable
Diffstat (limited to 'src/delegate.erl')
-rw-r--r--src/delegate.erl12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/delegate.erl b/src/delegate.erl
index b622dc6b7b..e833b81953 100644
--- a/src/delegate.erl
+++ b/src/delegate.erl
@@ -62,6 +62,13 @@ invoke(Pid, Fun) when is_pid(Pid) ->
erlang:raise(Class, Reason, StackTrace)
end;
+invoke([], _Fun) -> %% optimisation
+ {[], []};
+invoke([Pid], Fun) when node(Pid) =:= node() -> %% optimisation
+ case safe_invoke(Pid, Fun) of
+ {ok, _, Result} -> {[{Pid, Result}], []};
+ {error, _, Error} -> {[], [{Pid, Error}]}
+ end;
invoke(Pids, Fun) when is_list(Pids) ->
{LocalPids, Grouped} = group_pids_by_node(Pids),
%% The use of multi_call is only safe because the timeout is
@@ -90,6 +97,11 @@ invoke_no_result(Pid, Fun) when is_pid(Pid) andalso node(Pid) =:= node() ->
invoke_no_result(Pid, Fun) when is_pid(Pid) ->
invoke_no_result([Pid], Fun);
+invoke_no_result([], _Fun) -> %% optimisation
+ ok;
+invoke_no_result([Pid], Fun) when node(Pid) =:= node() -> %% optimisation
+ safe_invoke(Pid, Fun), %% must not die
+ ok;
invoke_no_result(Pids, Fun) when is_list(Pids) ->
{LocalPids, Grouped} = group_pids_by_node(Pids),
case orddict:fetch_keys(Grouped) of