X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fbeam_stats_delta.erl;h=45cfdb007a0065bef733a11465cb161e3550f876;hb=7dbc59b67d2cebe0e498ac4fd167cbaabed0e55b;hp=d563507455347d9183246af4ddb1f084001e06a2;hpb=b2c364fd163d74df4914b6d4d5da42dec28368af;p=beam_stats.git diff --git a/src/beam_stats_delta.erl b/src/beam_stats_delta.erl index d563507..45cfdb0 100644 --- a/src/beam_stats_delta.erl +++ b/src/beam_stats_delta.erl @@ -9,10 +9,13 @@ , stop/1 , of_context_switches/1 , of_io/1 + , of_reductions/1 + , of_process_info_reductions/2 ]). -record(?MODULE, { erlang_statistics :: ets:tid() + , erlang_process_info_reductions :: ets:tid() }). -define(T, #?MODULE). @@ -29,15 +32,19 @@ start() -> ], ?T { erlang_statistics = ets:new(beam_stats_delta_erlang_statistics, Options) + , erlang_process_info_reductions = + ets:new(beam_stats_delta_erlang_process_info_reductions, Options) }. -spec stop(t()) -> {}. stop(?T { erlang_statistics = TidErlangStatistics + , erlang_process_info_reductions = TidErlangProcessInfoReductions } ) -> true = ets:delete(TidErlangStatistics), + true = ets:delete(TidErlangProcessInfoReductions), {}. -spec of_context_switches(t()) -> @@ -62,8 +69,32 @@ of_io(?T{erlang_statistics=Table}) -> , {io_bytes_out , DeltaOut} }. --spec delta(ets:tid(), atom(), non_neg_integer()) -> +% We can get between-calls-delta directly from erlang:statistics(reductions), +% but then if some other process also calls it - we'll get incorrect data on +% the next call. +% Managing deltas ourselves here, will at least reduce the possible callers to +% only those with knowledge of our table ID. +-spec of_reductions(t()) -> non_neg_integer(). +of_reductions(?T{erlang_statistics=Table}) -> + Key = reductions, + {Current, _} = beam_stats_source:erlang_statistics(Key), + delta(Table, Key, Current). + +-spec of_process_info_reductions(t(), pid()) -> + hope_option:t(non_neg_integer()). +of_process_info_reductions(?T{erlang_process_info_reductions=Table}, Pid) -> + case beam_stats_source:erlang_process_info(Pid, reductions) + of undefined -> + none + ; {reductions, Current} -> + Delta = delta(Table, Pid, Current), + {some, Delta} + end. + +-spec delta(ets:tid(), Key, non_neg_integer()) -> + non_neg_integer() + when Key :: atom() | pid(). delta(Table, Key, CurrentTotal) -> PreviousTotalOpt = find(Table, Key), PreviousTotal = hope_option:get(PreviousTotalOpt, 0),