[erlang-questions] Counters

Donald Steven t6sn7gt@REDACTED
Mon Apr 25 12:17:53 CEST 2016


Thanks Bengt.

On 04/25/2016 01:34 AM, Bengt Kleberg wrote:
> Greetings,
>
> Two things, that I think should be mention, about the code below:
> The comment
> They will be transliterated into "counter_1"
> is wrong. The code suffixes "counter_" with the integer 1, which is 
> not "1", but SOH.
> Also, it is good to comment each usage of erlang:list_to_atom/1 with 
> an acknowledgment that it has the potential to exhaust memory. Not 
> when use in moderation and definitely not in this case, but as a 
> reminder, lest the problem be forgotten.
>
>
> bengt
>
> On 04/25/2016 12:36 AM, Donald Steven wrote:
>> Hi all,
>>
>> With the archived help provided by Alpar Juttner and Witold Baryluk, 
>> I thought I would share (primarily for other newbees like me), one 
>> way to implement counters.
>>
>> Best,
>>
>> Don
>>
>> =================================================================================== 
>>
>>
>> %%%-------------------------------------------------------------------------- 
>>
>> %%% File       : counter.erl, version 1.00
>> %%% Author     : Donald Steven <impartialmusic@REDACTED>, adapted from 
>> code
>> %%%              suggested by Alpar Juttner and Witold Baryluk of the 
>> Erlang
>> %%%              community
>> %%% Purpose    : To demonstrate multiple independent counters
>> %%% Created    : 24 Apr 2016
>> %%% Invocation : erlc counter.erl
>> %%%              erl -noshell -s counter main -s init stop
>> %%%-------------------------------------------------------------------------- 
>>
>>
>> -module(counter).
>> -export([main/0,inc/1,dec/1,current/1,start/1,loop/1]).
>>
>> %%%-------------------------------------------------------------------------- 
>>
>> %%% Fun     : inc(X), dec(X), current(X)
>> %%% Purpose : Increment, decrement the counter X, and provide its 
>> current
>> %%%           state
>> %%% Created : 24 Apr 2016
>> %%%-------------------------------------------------------------------------- 
>>
>>
>> inc(X) ->
>>     list_to_atom("counter_" ++ [X]) ! inc_counter,
>>     ok.
>>
>> dec(X) ->
>>     list_to_atom("counter_" ++ [X]) ! dec_counter,
>>     ok.
>>
>> current(X) ->
>>     list_to_atom("counter_" ++ [X]) ! {get_counter, self()},
>>     receive
>>         { counter_value, Cnt } ->
>>             Cnt
>>     end.
>>
>> %%%-------------------------------------------------------------------------- 
>>
>> %%% Fun     : start(X) and loop(Counter)
>> %%% Purpose : Start the counter X
>> %%% Created : 24 Apr 2016
>> %%%-------------------------------------------------------------------------- 
>>
>>
>> start(X) ->
>>
>>     Pid = spawn(counter,loop,[0]),
>>     Name = list_to_atom("counter_" ++ [X]),
>>     register(Name, Pid),
>>     ok.
>>
>> loop(Counter) ->
>>     receive
>>         inc_counter ->
>>             NewCounter = Counter+1;
>>         dec_counter ->
>>             NewCounter = Counter-1;
>>         {get_counter, Pid} ->
>>             Pid ! { counter_value, Counter },
>>             NewCounter = Counter
>>     end,
>>     loop(NewCounter).
>>
>> %%%-------------------------------------------------------------------------- 
>>
>> %%% Fun     : main()
>> %%% Purpose : Demonstrate usage
>> %%% Created : 24 Apr 2016
>> %%%-------------------------------------------------------------------------- 
>>
>>
>> main() ->
>>
>>     I = 1,          % IMPORTANT: these are counter numbers, not values
>>     J = 2,          % They will be transliterated into "counter_1" and
>>                     % "counter_2" internal to the various funs
>>
>>     start(I),       % start counters I and J
>>     start(J),       % all counters start at 0
>>
>>     inc(I), inc(I),                 % increment and decrement 'out of 
>> order'
>>     inc(J), inc(J), inc(J), inc(J), % to verify counter independence
>>     inc(I),                         % results should be counter I = 2 
>> and
>>     dec(J),                         % counter J = 3
>>     dec(I),
>>
>>     io:format("Current counter I: ~p~n", [current(I)]),
>>     io:format("Current counter J: ~p~n", [current(J)]).
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list