Introduce plain_rpc

Institutionalize the way hanoi_level handles RPC.
This is embodied in a new module, which should be
pushed to plain_fsm, but we'll keep it here for
now.
This commit is contained in:
Kresten Krab Thorup 2012-04-26 00:49:57 +02:00
parent db116447fe
commit d58ab9ea32
2 changed files with 91 additions and 0 deletions

29
include/plain_rpc.hrl Normal file
View file

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

62
src/plain_rpc.erl Normal file
View file

@ -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 <krab@trifork.com>').
-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.