[erlang-questions] Order of message processing by a gen_server
Jack Orenstein
jao@REDACTED
Wed Dec 5 07:22:52 CET 2007
On Dec 5, 2007, at 12:40 AM, Lev Walkin wrote:
> Jack Orenstein wrote:
>> Suppose I have a gen_server process whose queue contains {a} and
>> {b}. Does the order of the handle_call function clauses determine
>> which message is processed first? I.e., if the function clauses are
>> handle_call({a}, From, State) -> ...
>> handle_call({b}, From, State) -> ...
>> is it guaranteed that {a} will be processed first?
>
> Yes, but this is implementation detail and is not guaranteed
> by the standard.
What I am trying to do is to write a server that will process a
series of requests, always the same requests (phase1, phase2, phase3)
in the same order. But I want to be able to cancel the sequence of
requests at any point, resetting the process state to be ready for
phase1 again. If I write my own function with a receive, I can do this:
loop(State) ->
receive
cancel -> ...
phase1 -> ...
phase2 -> ...
phase3 -> ...
end.
Normally this server will receive messages phase1, phase2, phase3 in
order. But if a cancel message shows up, e.g. after phase2, it takes
priority (if I understand receive correctly).
I'd like to use a gen_server, but it sounds like I can't do anything
that is guaranteed by the language (not the implementation) to handle
the cancel message with higher priority than any of the other
messages. I.e.,
handle_call({cancel}, From, State) -> ...
handle_call({phase1}, From, State) -> ...
handle_call({phase2}, From, State) -> ...
handle_call({phase3}, From, State) -> ...
isn't guaranteed to work similarly to the loop function above.
Any advice on how to proceed?
Jack Orenstein
More information about the erlang-questions
mailing list