[erlang-questions] Counters

Donald Steven t6sn7gt@REDACTED
Tue Apr 26 12:27:53 CEST 2016


Thanks Richard and Garret for your comments and patience with a newbie.

Don

On 04/25/2016 11:53 PM, Richard A. O'Keefe wrote:
>
>
> On 25/04/16 10:36 AM, Donald Steven wrote:
>> 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.
>
> NO!  DANGER, WILL ROBINSON!
>
> Atoms are held in a fixed size table and are not garbage collected.
> Constructing new atoms at run time is generally a bad idea.
>
> That was the first thing I thought of when I saw this, but it's
> actually not the worst problem.  The only values of X that make
> list_to_atom("counter_" ++ [X]) legal are the integers 0 to 255
> inclusive.  That is, a counter name X *must* be an integer 0 to 255
> AND YOU HAVE NOT DOCUMENTED THIS.
>
> Your module should NOT be registering counters.
>
> There should simply be functions
>
>     new_counter() ->
>         new_counter(0).
>
>     new_counter(N) ->
>         spawn(fun () -> loop(N) end).
>
> and the *CALLER* can register a counter if there is a reason to.
>
> It's not just that doing it that way removes an arbitrary limitation,
> it's that as things stand, a malicious program can easily destroy all
> the counters.  *And* it avoids the problem where two processes
> both try to start counter 5.  I have used two programming languages
> (Fortran and IMP) in which I/O channels were referred to by number
> and it was seriously painful trying to combine libraries that assumed
> they had sole control of channel N.
>
> By the way, I didn't see anything to *terminate* a counter.
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list