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:
parent
db116447fe
commit
d58ab9ea32
2 changed files with 91 additions and 0 deletions
29
include/plain_rpc.hrl
Normal file
29
include/plain_rpc.hrl
Normal 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
62
src/plain_rpc.erl
Normal 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.
|
||||
|
||||
|
Loading…
Reference in a new issue