diff options
author | Johan Claesson <[email protected]> | 2017-05-15 23:25:13 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2017-08-24 16:32:31 +0200 |
commit | 25978542a49e36729ca8f856b9949ec895fe58c0 (patch) | |
tree | 177629b660eeca07503f6dbd28041d3776e48ae4 | |
parent | 6c8d1ac3112a0cc61849741fd667bbccfa01ee54 (diff) | |
download | otp-25978542a49e36729ca8f856b9949ec895fe58c0.tar.gz otp-25978542a49e36729ca8f856b9949ec895fe58c0.tar.bz2 otp-25978542a49e36729ca8f856b9949ec895fe58c0.zip |
fprof: Sum callers and callees
When sampling multiple processes and analyzing with totals true sum
together all caller and callee entries which concerns the same
function. Previous behaviour was to report each contributing entry.
-rw-r--r-- | lib/tools/src/fprof.erl | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/tools/src/fprof.erl b/lib/tools/src/fprof.erl index d1a4624419..436f68d12b 100644 --- a/lib/tools/src/fprof.erl +++ b/lib/tools/src/fprof.erl @@ -2636,22 +2636,32 @@ funcstat_pd(Pid, Func1, Func0, Clocks) -> #funcstat{callers_sum = CallersSum, callers = Callers} = FuncstatCallers -> FuncstatCallers#funcstat{ - callers_sum = clocks_sum(CallersSum, Clocks, Func0), - callers = [Clocks#clocks{id = Func1} | Callers]} - end), + callers_sum = clocks_sum(CallersSum, Clocks, Func0), + callers = insert_call(Clocks, Func1, Callers)} + end), put({Pid, Func1}, case get({Pid, Func1}) of undefined -> - #funcstat{callers_sum = #clocks{id = Func1}, + #funcstat{callers_sum = #clocks{id = Func1}, called_sum = Clocks#clocks{id = Func1}, called = [Clocks#clocks{id = Func0}]}; #funcstat{called_sum = CalledSum, called = Called} = FuncstatCalled -> FuncstatCalled#funcstat{ called_sum = clocks_sum(CalledSum, Clocks, Func1), - called = [Clocks#clocks{id = Func0} | Called]} + called = insert_call(Clocks, Func0, Called)} end). +insert_call(Clocks, Func, ClocksList) -> + insert_call(Clocks, Func, ClocksList, []). + +insert_call(Clocks, Func, [#clocks{id = Func} = C | T], Acc) -> + [clocks_sum(C, Clocks, Func) | T ++ Acc]; +insert_call(Clocks, Func, [H | T], Acc) -> + insert_call(Clocks, Func, T, [H | Acc]); +insert_call(Clocks, Func, [], Acc) -> + [Clocks#clocks{id = Func} | Acc]. + %% Sort a list of funcstat records, |