[erlang-questions] using guards in gen_server
Ulf Wiger
ulf.wiger@REDACTED
Sun Aug 29 21:33:56 CEST 2010
On 29/08/2010 11:20, Zvi wrote:
> Hi,
>
> When writing gen_server, do you put validation guards in API functions
> or in handle_call / cast or in both ? What's the convention?
A convention I use, for cases where I really can't know
until in the handle_call whether the input is ok, is to
e.g. reply 'badarg' and handle it in a wrapper around
gen_server:call():
http://github.com/esl/gproc/blob/master/src/gproc.erl#L849
call(Req) ->
call(Req, l).
call(Req, l) ->
chk_reply(gen_server:call(?MODULE, Req), Req);
call(Req, g) ->
chk_reply(gproc_dist:leader_call(Req), Req).
chk_reply(Reply, Req) ->
case Reply of
badarg -> erlang:error(badarg, Req);
Reply -> Reply
end.
A slight disadvantage is that the error is reported as
happening in chk_reply/2 rather than in the API function.
This could be fixed e.g. by adding some ugly macros.
The server side might then look like:
http://github.com/esl/gproc/blob/master/src/gproc.erl#L764
handle_call({reg, {_T,l,_} = Key, Val}, {Pid,_}, S) ->
case try_insert_reg(Key, Val, Pid) of
true ->
gproc_lib:ensure_monitor(Pid,l),
{reply, true, S};
false ->
{reply, badarg, S}
end;
...
BR,
Ulf W
--
Ulf Wiger
CTO, Erlang Solutions Ltd, formerly Erlang Training & Consulting Ltd
http://www.erlang-solutions.com
More information about the erlang-questions
mailing list