gmhive_client/src/gmhc_counters.erl
2025-05-13 23:56:46 +02:00

54 lines
1.2 KiB
Erlang

-module(gmhc_counters).
-export([ initialize/0 ]).
-export([ add/1
, add/2
, add_read/1
, add_read/2
, get_value/1
, values/0 ]).
counters() ->
#{ connector => 1 }.
initialize() ->
Counters = counters(),
Size = map_size(Counters),
CRef = counters:new(Size, []),
put_counters(#{ref => CRef, counters => Counters}).
add(Counter) ->
add(Counter, 1).
add(Counter, Incr) when is_integer(Incr), Incr >= 0 ->
{CRef, Ix} = counter_ix(Counter),
counters:add(CRef, Ix, Incr).
add_read(Counter) ->
add_read(Counter, 1).
add_read(Counter, Incr) when is_integer(Incr), Incr >= 0 ->
{CRef, Ix} = counter_ix(Counter),
counters:add(CRef, Ix, Incr),
counters:get(CRef, Ix).
get_value(Counter) ->
{CRef, Ix} = counter_ix(Counter),
counters:get(CRef, Ix).
values() ->
#{ref := CRef, counters := Counters} = get_counters(),
maps:map(fun(_,Ix) -> counters:get(CRef, Ix) end, Counters).
counter_ix(Counter) ->
#{ref := CRef, counters := #{Counter := Ix}} = get_counters(),
{CRef, Ix}.
put_counters(C) ->
persistent_term:put(?MODULE, C).
get_counters() ->
persistent_term:get(?MODULE).