[erlang-questions] Generic server and selective receives
ludovic@REDACTED
ludovic@REDACTED
Mon Feb 17 00:55:19 CET 2014
Hi,
I would like some help to implement a message-buffer in erlang. This
process can be sent messages, and stores them in mailbox. A buffer can
have one client, or can have no client. When there's no client, I
would prevent the process to do anything but accept a new client or
timeout after a small amount of time. So I have two sets of receive
clauses.
Now, I would like to implement this as a gen_server. But I don't know
how. The Idea is to timeout quickly if no message of the expected
clauses-set comes.
* I thought of a gen_fsm but it will crash if it's sent a message when
in the "no client" state, right ? (Plus i may want to handle more
receive clauses in the "no client" part)
* I thougt about time calculations but it's seems too complicated for
no reason ; I prefer use the simple gen_* timeouts.
* I could keep my current implementation and adapt the module to fit
in a supervision tree but I believe I willll miss common OTP features.
So, I hope this is a common pattern and that someone will tell me a
good solution.
Thank you.
-- lud
This is my current implementation (but not the actual code).
loop(#state{client_pid=undefined}) ->
receive
{set_client,Pid} ->
loop(State#state{client_pid=Pid})
after 10000 ->
io:fwrite("Terminating\n")
end;
loop(State=#state{client_pid=Client,mailbox=Mailbox}) ->
receive
{set_client,Pid} ->
%% here we can change the client or set it to undefined
loop(State#state{client_pid=Pid});
{message,M} ->
Client ! you_have_messages,
loop(State#state{mailbox=[M|Mailbox]});
%% A handful of other clauses
...
...
...
after way more time than 1000 ->
io:fwrite("Terminating too\n")
end;
Now i'll pray for this mail to be seen in the current huge amount of
emails (and very intersting by the way) on the list.
More information about the erlang-questions
mailing list