diff options
author | Adam Kocoloski <adam@cloudant.com> | 2010-05-01 08:37:53 -0400 |
---|---|---|
committer | Adam Kocoloski <adam@cloudant.com> | 2010-05-01 08:37:53 -0400 |
commit | 6e6813d355aa7371f63e46472faaa2b326ddf394 (patch) | |
tree | a2fa6d748e375bf9e5ae9e6607233c56a2ac42ec /src/rexi.erl | |
parent | 09a9e6e6e88974b5bcc91a35275b71a104846674 (diff) |
rexi API module, and change msg sent if rexi worker dies
Diffstat (limited to 'src/rexi.erl')
-rw-r--r-- | src/rexi.erl | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/rexi.erl b/src/rexi.erl new file mode 100644 index 00000000..745afedb --- /dev/null +++ b/src/rexi.erl @@ -0,0 +1,38 @@ +-module(rexi). +-export([start/0, stop/0, restart/0]). +-export([cast/2, cast/3]). +-export([reply/1]). + +-define(SERVER, rexi_server). + +start() -> + application:start(rexi). + +stop() -> + application:stop(rexi). + +restart() -> + stop(), start(). + +-spec cast(node(), mfa()) -> {ok, reference()}. +cast(Node, MFA) -> + cast(Node, self(), MFA). + +%% @doc Executes apply(M, F, A) on Node. +%% You might want to use this instead of rpc:cast/4 for two reasons. First, +%% the Caller pid and the returned reference are inserted into the remote +%% process' dictionary as 'rexi_from', so it has a way to communicate with you. +%% Second, the remote process is monitored. If it dies, Caller will receive a +%% message of the form `{rexi_EXIT, Ref, Reason}' where Ref is the returned +%% reference and Reason is the exit reason. +-spec cast(node(), pid(), mfa()) -> {ok, reference()}. +cast(Node, Caller, MFA) -> + Ref = make_ref(), + ok = gen_server:cast({?SERVER, Node}, {doit, {Caller,Ref}, MFA}), + {ok, Ref}. + +%% @doc convenience function to reply to the original rexi Caller. +-spec reply(any()) -> any(). +reply(Reply) -> + {Caller, Ref} = get(rexi_from), + erlang:send(Caller, {Ref,Reply}). |