aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Claesson <[email protected]>2017-05-15 23:25:13 +0200
committerLukas Larsson <[email protected]>2017-08-24 16:32:31 +0200
commit25978542a49e36729ca8f856b9949ec895fe58c0 (patch)
tree177629b660eeca07503f6dbd28041d3776e48ae4
parent6c8d1ac3112a0cc61849741fd667bbccfa01ee54 (diff)
downloadotp-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.erl20
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,