diff options
author | Matthew Sackman <matthew@rabbitmq.com> | 2011-08-18 13:00:15 +0100 |
---|---|---|
committer | Matthew Sackman <matthew@rabbitmq.com> | 2011-08-18 13:00:15 +0100 |
commit | 5f785e38f4a12f86a124a15e90dd37a1ab3da71d (patch) | |
tree | 0df0de114994bcd808c48b853a03db643de2837c | |
parent | d2279893cfb93606cd39820e6e39c86c0da57ee4 (diff) | |
download | rabbitmq-server-5f785e38f4a12f86a124a15e90dd37a1ab3da71d.tar.gz |
Add mechanics for sending msgs suitably
-rw-r--r-- | src/gen_server2.erl | 40 |
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. |