summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2011-08-18 13:00:15 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2011-08-18 13:00:15 +0100
commit5f785e38f4a12f86a124a15e90dd37a1ab3da71d (patch)
tree0df0de114994bcd808c48b853a03db643de2837c
parentd2279893cfb93606cd39820e6e39c86c0da57ee4 (diff)
downloadrabbitmq-server-5f785e38f4a12f86a124a15e90dd37a1ab3da71d.tar.gz
Add mechanics for sending msgs suitably
-rw-r--r--src/gen_server2.erl40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/gen_server2.erl b/src/gen_server2.erl
index 35258139..10df9d3b 100644
--- a/src/gen_server2.erl
+++ b/src/gen_server2.erl
@@ -178,6 +178,7 @@
start_link/3, start_link/4,
call/2, call/3,
cast/2, reply/2,
+ pcall/2, pcall/3, pcast/2,
abcast/2, abcast/3,
multi_call/2, multi_call/3, multi_call/4,
enter_loop/3, enter_loop/4, enter_loop/5, enter_loop/6, wake_hib/1]).
@@ -263,19 +264,31 @@ start_link(Name, Mod, Args, Options) ->
%% is handled here (? Shall we do that here (or rely on timeouts) ?).
%% -----------------------------------------------------------------
call(Name, Request) ->
- case catch gen:call(Name, '$gen_call', Request) of
+ do_call(Name, '$gen_call', Request, call).
+
+call(Name, Request, Timeout) ->
+ do_call(Name, '$gen_call', Request, Timeout, call).
+
+pcall(Name, Request) ->
+ do_call(Name, {'$gen_call', self()}, Request, pcall).
+
+pcall(Name, Request, Timeout) ->
+ do_call(Name, {'$gen_call', self()}, Request, Timeout, pcall).
+
+do_call(Name, Tag, Request, Call) ->
+ case catch gen:call(Name, Tag, Request) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
- exit({Reason, {?MODULE, call, [Name, Request]}})
+ exit({Reason, {?MODULE, Call, [Name, Request]}})
end.
-call(Name, Request, Timeout) ->
- case catch gen:call(Name, '$gen_call', Request, Timeout) of
+do_call(Name, Tag, Request, Timeout, Call) ->
+ case catch gen:call(Name, Tag, Request, Timeout) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
- exit({Reason, {?MODULE, call, [Name, Request, Timeout]}})
+ exit({Reason, {?MODULE, Call, [Name, Request, Timeout]}})
end.
%% -----------------------------------------------------------------
@@ -291,11 +304,26 @@ cast(Dest, Request) when is_atom(Dest) ->
cast(Dest, Request) when is_pid(Dest) ->
do_cast(Dest, Request).
+pcast({global,Name}, Request) ->
+ catch global:send(Name, pcast_msg(Request, self())),
+ ok;
+pcast({Name,Node}=Dest, Request) when is_atom(Name), is_atom(Node) ->
+ do_pcast(Dest, Request);
+pcast(Dest, Request) when is_atom(Dest) ->
+ do_pcast(Dest, Request);
+pcast(Dest, Request) when is_pid(Dest) ->
+ do_pcast(Dest, Request).
+
do_cast(Dest, Request) ->
do_send(Dest, cast_msg(Request)),
ok.
-cast_msg(Request) -> {'$gen_cast',Request}.
+do_pcast(Dest, Request) ->
+ do_send(Dest, pcast_msg(Request, self())),
+ ok.
+
+cast_msg(Request) -> {'$gen_cast', Request}.
+pcast_msg(Request, Pid) -> {{'$gen_cast', Pid}, Request}.
%% -----------------------------------------------------------------
%% Send a reply to the client.