diff --git a/include/plain_rpc.hrl b/include/plain_rpc.hrl new file mode 100644 index 0000000..09e68dd --- /dev/null +++ b/include/plain_rpc.hrl @@ -0,0 +1,29 @@ +%% ---------------------------------------------------------------------------- +%% +%% plain_rpc: RPC module to accompany plain_fsm +%% +%% Copyright 2011-2012 (c) Trifork A/S. All Rights Reserved. +%% http://trifork.com/ info@trifork.com +%% +%% This file is provided to you under the Apache License, Version 2.0 (the +%% "License"); you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +%% License for the specific language governing permissions and limitations +%% under the License. +%% +%% ---------------------------------------------------------------------------- + +%% +%% This module really belongs in the plain_fsm distro. +%% + +-define(CALL(From,Msg), {'$call', From, Msg}). +-define(REPLY(Ref,Msg), {'$reply', Ref, Msg}). +-define(CAST(From,Msg), {'$cast', From, Msg}). + diff --git a/src/plain_rpc.erl b/src/plain_rpc.erl new file mode 100644 index 0000000..cc7e467 --- /dev/null +++ b/src/plain_rpc.erl @@ -0,0 +1,62 @@ +%% ---------------------------------------------------------------------------- +%% +%% plain_rpc: RPC module to accompany plain_fsm +%% +%% Copyright 2011-2012 (c) Trifork A/S. All Rights Reserved. +%% http://trifork.com/ info@trifork.com +%% +%% This file is provided to you under the Apache License, Version 2.0 (the +%% "License"); you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +%% License for the specific language governing permissions and limitations +%% under the License. +%% +%% ---------------------------------------------------------------------------- + +-module(plain_rpc). +-author('Kresten Krab Thorup '). + +-export([send_call/2, receive_reply/1, send_reply/2, call/2, send_cast/2]). + +-include("include/plain_rpc.hrl"). + + +send_call(PID, Request) -> + Ref = erlang:monitor(process, PID), + PID ! ?CALL({self(), Ref}, Request), + Ref. + +send_cast(PID, Msg) -> + PID ! ?CAST(self(), Msg). + +receive_reply(MRef) -> + receive + ?REPLY(MRef, Reply) -> + erlang:demonitor(MRef, [flush]), + Reply; + {'DOWN', MRef, _, _, Reason} -> + exit(Reason) + end. + +send_reply({PID,Ref}, Reply) -> + erlang:send(PID, ?REPLY(Ref, Reply)), + ok. + +call(PID,Request) -> + MRef = erlang:monitor(process, PID), + PID ! ?CALL({self(), MRef}, Request), + receive + ?REPLY(MRef, Reply) -> + erlang:demonitor(MRef, [flush]), + Reply; + {'DOWN', MRef, _, _, Reason} -> + exit(Reason) + end. + +