summaryrefslogtreecommitdiff
path: root/src/rexi.erl
diff options
context:
space:
mode:
authorAdam Kocoloski <adam@cloudant.com>2010-05-01 08:37:53 -0400
committerAdam Kocoloski <adam@cloudant.com>2010-05-01 08:37:53 -0400
commit6e6813d355aa7371f63e46472faaa2b326ddf394 (patch)
treea2fa6d748e375bf9e5ae9e6607233c56a2ac42ec /src/rexi.erl
parent09a9e6e6e88974b5bcc91a35275b71a104846674 (diff)
rexi API module, and change msg sent if rexi worker dies
Diffstat (limited to 'src/rexi.erl')
-rw-r--r--src/rexi.erl38
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}).