| -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}). |