<div dir="ltr">Take a look at plain_fsm:<div><br></div><div><a href="https://github.com/uwiger/plain_fsm/blob/master/doc/plain_fsm.md">https://github.com/uwiger/plain_fsm/blob/master/doc/plain_fsm.md</a><br></div><div><br>
</div><div>Dan.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Feb 16, 2014 at 5:55 PM,  <span dir="ltr"><<a href="mailto:ludovic@demblans.com" target="_blank">ludovic@demblans.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I would like some help to implement a message-buffer in erlang. This<br>
process can be sent messages, and stores them in mailbox. A buffer can<br>
have one client, or can have no client. When there's no client, I<br>
would prevent the process to do anything but accept a new client or<br>
timeout after a small amount of time. So I have two sets of receive<br>
clauses.<br>
<br>
Now, I would like to implement this as a gen_server. But I don't know<br>
how. The Idea is to timeout quickly if no message of the expected<br>
clauses-set comes.<br>
<br>
* I thought of a gen_fsm but it will crash if it's sent a message when<br>
in the "no client" state, right ? (Plus i may want to handle more<br>
receive clauses in the "no client" part)<br>
* I thougt about time calculations but it's seems too complicated for<br>
no reason ; I prefer use the simple gen_* timeouts.<br>
* I could keep my current implementation and adapt the module to fit<br>
in a supervision tree but I believe I willll miss common OTP features.<br>
<br>
So, I hope this is a common pattern and that someone will tell me a<br>
good solution.<br>
<br>
Thank you.<br>
<br>
-- lud<br>
<br>
This is my current implementation (but not the actual code).<br>
<br>
    loop(#state{client_pid=<u></u>undefined}) -><br>
        receive<br>
            {set_client,Pid} -><br>
                loop(State#state{client_pid=<u></u>Pid})<br>
        after 10000 -><br>
            io:fwrite("Terminating\n")<br>
        end;<br>
<br>
    loop(State=#state{client_pid=<u></u>Client,mailbox=Mailbox}) -><br>
        receive<br>
            {set_client,Pid} -><br>
                %% here we can change the client or set it to undefined<br>
                loop(State#state{client_pid=<u></u>Pid});<br>
            {message,M} -><br>
                Client ! you_have_messages,<br>
                loop(State#state{mailbox=[M|<u></u>Mailbox]});<br>
            %% A handful of other clauses<br>
            ...<br>
                ...<br>
                ...<br>
        after way more time than 1000 -><br>
            io:fwrite("Terminating too\n")<br>
        end;<br>
<br>
<br>
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.<br>
<br>
______________________________<u></u>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
</blockquote></div><br></div>