[erlang-questions] automatically delete older messages with the same tag (atom)?
Cameron Kerr
ckerr@REDACTED
Wed May 6 01:23:43 CEST 2009
You just need a small proxy process that implements a message
dictionary rather than a message queue. The dictionary could even be
the processes dictionary. Something like this perhaps (completely
untested, and from a relative newbie)
-module(message_dictionary).
-export([get/2, start/0, stop/1]).
start() ->
spawn(fun loop/0). % should probably be spawn_link instead
loop() ->
receive
{get, From, Tag} ->
From ! erlang:get(Tag),
io:format("Returning message with tag ~p, value ~p and removing
from dictionary~n",
[Tag, erlang:get(Tag)]),
erlang:erase(Tag),
loop();
stop ->
ok;
{Tag, Msg}=M ->
case erlang:put(Tag, Msg) of
undefined ->
io:format("Received message ~p; did not replace any old
message~n", [M]);
Old ->
io:format("Received message ~p; replaced old message ~p~n", [M,
Old])
end,
loop();
Other ->
io:format("Received untagged message ~p~n", [Other]),
loop();
end.
%%% Client functions
get(Pid, Tag) ->
Pid ! {get, self(), Tag},
receive
Any -> Any
end.
stop(Pid) ->
Pid ! stop.
So basically all it does is implement a small process which accepts
messages (eg. {msgtag, {some, [structure, of], [[whatever]]}}) and
stores this in the processes dictionary, as illustrated with just put
and get below:
1> put(foo, bar).
undefined
2> put(foo, baz).
bar
3> get(foo).
baz
Hopefully there are no glaring faults; I'm still reasonably new to
designing programs in Erlang myself, perhaps others will help to point
out and repair any holes.
On 06/05/2009, at 3:04 AM, Giorgos Kollias wrote:
> Hello Erlang users,
>
> Is there an option in the Erlang runtime to automatically delete a
> message that has been deposited into a process's mailbox as soon as
> a newer message with the same tag arrives? Is it easy to "patch" the
> Erlang language source code to support this "little" feature in case
> this is not there?
>
> Or the only feasible way of getting this behavior is just to receive
> all messages till you get a sort of timeout and just keep the latest
> message with the tag you are interested in (i.e. user code only) in
> each receive phase? Is there a standard code idiom/snippet for this?
>
> This feature would be very interesting for implementing the
> asynchronous iterations computing paradigm where each process only
> keeps the most up-to-date message when it looks into its incoming
> messages.
>
> Thanks in advance,
>
> giorgos
>
>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
--
Cameron Kerr <ckerr@REDACTED>
Teaching Fellow, Computer Science, University of Otago
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20090506/f36552ed/attachment.htm>
More information about the erlang-questions
mailing list