File 2222-observer-Add-a-max-carrier-size-column.patch of Package erlang

From 8ddf6320dd2d82d47fc616a0f23f891b234f1b27 Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Mon, 13 Feb 2017 15:41:35 +0100
Subject: [PATCH 2/2] observer: Add a max carrier size column

Users wanted to see the maximum value seen by observer during it's uptime.
Note changes faster than the sample rate will still be missed.
---
 lib/observer/doc/src/observer_ug.xml   |  5 +++++
 lib/observer/src/observer_alloc_wx.erl | 35 ++++++++++++++++++++++++----------
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/lib/observer/doc/src/observer_ug.xml b/lib/observer/doc/src/observer_ug.xml
index 6eb72f3e5..ae85ab7a2 100644
--- a/lib/observer/doc/src/observer_ug.xml
+++ b/lib/observer/doc/src/observer_ug.xml
@@ -107,6 +107,11 @@
     see module
     <seealso marker="erts:erts_alloc"><c>erts_alloc</c></seealso>
     in application ERTS.</p>
+    <p>The <c>Max Carrier size</c> column shows the maximum value seen by observer
+    since the last node change or since the start of the application, i.e. switching
+    nodes will reset the max column. Values are sampled so higher values may have
+    existed than what is shown.
+    </p>
   </section>
 
   <section>
diff --git a/lib/observer/src/observer_alloc_wx.erl b/lib/observer/src/observer_alloc_wx.erl
index ca54080e1..cad02087b 100644
--- a/lib/observer/src/observer_alloc_wx.erl
+++ b/lib/observer/src/observer_alloc_wx.erl
@@ -36,6 +36,7 @@
 	  wins,
 	  mem,
 	  samples,
+          max,
 	  panel,
 	  paint,
 	  appmon,
@@ -74,7 +75,8 @@ init([Notebook, Parent]) ->
 		      wins  = Windows,
 		      mem   = MemWin,
 		      paint = PaintInfo,
-		      time  = setup_time()
+		      time  = setup_time(),
+                      max   = #{}
 		     }
 	}
     catch _:Err ->
@@ -126,16 +128,17 @@ handle_info({Key, {promise_reply, {badrpc, _}}}, #state{async=Key} = State) ->
     {noreply, State#state{active=false, appmon=undefined}};
 
 handle_info({Key, {promise_reply, SysInfo}},
-	    #state{async=Key, panel=_Panel, samples=Data, active=Active, wins=Wins0,
-		   time=#ti{tick=Tick, disp=Disp0}=Ti} = S0) ->
+	    #state{async=Key, samples=Data, max=Max0,
+                   active=Active, wins=Wins0, time=#ti{tick=Tick, disp=Disp0}=Ti} = S0) ->
     Disp = trunc(Disp0),
     Next = max(Tick - Disp, 0),
     erlang:send_after(1000 div ?DISP_FREQ, self(), {refresh, Next}),
     Info = alloc_info(SysInfo),
+    Max = lists:foldl(fun calc_max/2, Max0, Info),
     {Wins, Samples} = add_data(Info, Data, Wins0, Ti, Active),
-    S1 = S0#state{time=Ti#ti{tick=Next}, wins=Wins, samples=Samples, async=undefined},
+    S1 = S0#state{time=Ti#ti{tick=Next}, wins=Wins, samples=Samples, max=Max, async=undefined},
     if Active ->
-	    update_alloc(S0, Info),
+	    update_alloc(S0, Info, Max),
 	    State = precalc(S1),
 	    {noreply, State};
        true ->
@@ -187,25 +190,35 @@ code_change(_, _, State) ->
 restart_fetcher(Node, #state{panel=Panel, wins=Wins0, time=Ti} = State) ->
     SysInfo = observer_wx:try_rpc(Node, observer_backend, sys_info, []),
     Info = alloc_info(SysInfo),
+    Max = lists:foldl(fun calc_max/2, #{}, Info),
     {Wins, Samples} = add_data(Info, {0, queue:new()}, Wins0, Ti, true),
     erlang:send_after(1000 div ?DISP_FREQ, self(), {refresh, 0}),
     wxWindow:refresh(Panel),
     precalc(State#state{active=true, appmon=Node, time=Ti#ti{tick=0},
-			wins=Wins, samples=Samples}).
+			wins=Wins, samples=Samples, max=Max}).
 
 precalc(#state{samples=Data0, paint=Paint, time=Ti, wins=Wins0}=State) ->
     Wins = [precalc(Ti, Data0, Paint, Win) || Win <- Wins0],
     State#state{wins=Wins}.
 
+calc_max({Name, _, Cs}, Max0) ->
+    case maps:get(Name, Max0, 0) of
+        Value when Value < Cs ->
+            Max0#{Name=>Cs};
+        _V ->
+            Max0
+    end.
 
-update_alloc(#state{mem=Grid}, Fields) ->
+update_alloc(#state{mem=Grid}, Fields, Max) ->
     wxWindow:freeze(Grid),
-    Max = wxListCtrl:getItemCount(Grid),
+    Last = wxListCtrl:getItemCount(Grid),
     Update = fun({Name, BS, CS}, Row) ->
-		     (Row >= Max) andalso wxListCtrl:insertItem(Grid, Row, ""),
+		     (Row >= Last) andalso wxListCtrl:insertItem(Grid, Row, ""),
+                     MaxV = maps:get(Name, Max, CS),
 		     wxListCtrl:setItem(Grid, Row, 0, observer_lib:to_str(Name)),
 		     wxListCtrl:setItem(Grid, Row, 1, observer_lib:to_str(BS div 1024)),
 		     wxListCtrl:setItem(Grid, Row, 2, observer_lib:to_str(CS div 1024)),
+                     wxListCtrl:setItem(Grid, Row, 3, observer_lib:to_str(MaxV div 1024)),
 		     Row + 1
 	     end,
     wx:foldl(Update, 0, Fields),
@@ -269,7 +282,9 @@ create_mem_info(Parent) ->
 		   end,
     ListItems = [{"Allocator Type",  ?wxLIST_FORMAT_LEFT,  200},
 		 {"Block size (kB)",  ?wxLIST_FORMAT_RIGHT, 150},
-		 {"Carrier size (kB)",?wxLIST_FORMAT_RIGHT, 150}],
+		 {"Carrier size (kB)",?wxLIST_FORMAT_RIGHT, 150},
+                 {"Max Carrier size (kB)",?wxLIST_FORMAT_RIGHT, 150}
+                ],
     lists:foldl(AddListEntry, 0, ListItems),
     wxListItem:destroy(Li),
 
-- 
2.12.0

openSUSE Build Service is sponsored by