xref: /netbsd-src/external/gpl3/binutils.old/dist/gprofng/src/Stats_data.cc (revision c42dbd0ed2e61fe6eda8590caa852ccf34719964)
1*c42dbd0eSchristos /* Copyright (C) 2021 Free Software Foundation, Inc.
2*c42dbd0eSchristos    Contributed by Oracle.
3*c42dbd0eSchristos 
4*c42dbd0eSchristos    This file is part of GNU Binutils.
5*c42dbd0eSchristos 
6*c42dbd0eSchristos    This program is free software; you can redistribute it and/or modify
7*c42dbd0eSchristos    it under the terms of the GNU General Public License as published by
8*c42dbd0eSchristos    the Free Software Foundation; either version 3, or (at your option)
9*c42dbd0eSchristos    any later version.
10*c42dbd0eSchristos 
11*c42dbd0eSchristos    This program is distributed in the hope that it will be useful,
12*c42dbd0eSchristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*c42dbd0eSchristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*c42dbd0eSchristos    GNU General Public License for more details.
15*c42dbd0eSchristos 
16*c42dbd0eSchristos    You should have received a copy of the GNU General Public License
17*c42dbd0eSchristos    along with this program; if not, write to the Free Software
18*c42dbd0eSchristos    Foundation, 51 Franklin Street - Fifth Floor, Boston,
19*c42dbd0eSchristos    MA 02110-1301, USA.  */
20*c42dbd0eSchristos 
21*c42dbd0eSchristos #include "config.h"
22*c42dbd0eSchristos //#include <search.h>     //  For the tsearch stuff
23*c42dbd0eSchristos #include <assert.h>
24*c42dbd0eSchristos //#include <stdlib.h>
25*c42dbd0eSchristos #include "Table.h"
26*c42dbd0eSchristos #include "Sample.h"
27*c42dbd0eSchristos #include "Stats_data.h"
28*c42dbd0eSchristos #include "util.h"
29*c42dbd0eSchristos #include "i18n.h"
30*c42dbd0eSchristos 
31*c42dbd0eSchristos //XXX:	The fundamental problem with this package of routines is that
32*c42dbd0eSchristos //XXX:	they should look a lot more like overview data. The result
33*c42dbd0eSchristos //XXX:	is that it is not possible to share as much code as would
34*c42dbd0eSchristos //XXX:	otherwise be possible.
35*c42dbd0eSchristos 
36*c42dbd0eSchristos int
size()37*c42dbd0eSchristos Stats_data::size ()
38*c42dbd0eSchristos {
39*c42dbd0eSchristos   // Return the number of Stats_item values associated with "this".
40*c42dbd0eSchristos   if (stats_items == NULL)
41*c42dbd0eSchristos     return 0;
42*c42dbd0eSchristos   return stats_items->size ();
43*c42dbd0eSchristos }
44*c42dbd0eSchristos 
45*c42dbd0eSchristos Stats_data::Stats_item
fetch(int index)46*c42dbd0eSchristos Stats_data::fetch (int index)
47*c42dbd0eSchristos {
48*c42dbd0eSchristos   // Routine will return the "index"'th Stats_item associated with "this".
49*c42dbd0eSchristos   assert (index >= 0 && index < stats_items->size ());
50*c42dbd0eSchristos   return *(stats_items->fetch (index));
51*c42dbd0eSchristos }
52*c42dbd0eSchristos 
Stats_data()53*c42dbd0eSchristos Stats_data::Stats_data ()
54*c42dbd0eSchristos {
55*c42dbd0eSchristos   // this constructor for use with sum()
56*c42dbd0eSchristos   packets = NULL;
57*c42dbd0eSchristos   stats_items = NULL;
58*c42dbd0eSchristos }
59*c42dbd0eSchristos 
Stats_data(DataView * _packets)60*c42dbd0eSchristos Stats_data::Stats_data (DataView *_packets)
61*c42dbd0eSchristos {
62*c42dbd0eSchristos   packets = _packets;
63*c42dbd0eSchristos   stats_items = NULL;
64*c42dbd0eSchristos   compute_data ();  // reads all data
65*c42dbd0eSchristos }
66*c42dbd0eSchristos 
~Stats_data()67*c42dbd0eSchristos Stats_data::~Stats_data ()
68*c42dbd0eSchristos {
69*c42dbd0eSchristos   if (stats_items)
70*c42dbd0eSchristos     {
71*c42dbd0eSchristos       stats_items->destroy ();
72*c42dbd0eSchristos       delete stats_items;
73*c42dbd0eSchristos     }
74*c42dbd0eSchristos }
75*c42dbd0eSchristos 
76*c42dbd0eSchristos void
sum(Stats_data * data)77*c42dbd0eSchristos Stats_data::sum (Stats_data *data)
78*c42dbd0eSchristos {
79*c42dbd0eSchristos   int index;
80*c42dbd0eSchristos   Stats_item *stats_item, *data_item;
81*c42dbd0eSchristos   if (stats_items == NULL)
82*c42dbd0eSchristos     {
83*c42dbd0eSchristos       stats_items = new Vector<Stats_item*>;
84*c42dbd0eSchristos       Vec_loop (Stats_item*, data->stats_items, index, data_item)
85*c42dbd0eSchristos       {
86*c42dbd0eSchristos 	stats_item = create_stats_item (data_item->value.ll, data_item->label);
87*c42dbd0eSchristos 	stats_items->append (stats_item);
88*c42dbd0eSchristos       }
89*c42dbd0eSchristos     }
90*c42dbd0eSchristos   else
91*c42dbd0eSchristos     {
92*c42dbd0eSchristos       Vec_loop (Stats_item*, data->stats_items, index, data_item)
93*c42dbd0eSchristos       {
94*c42dbd0eSchristos 	stats_items->fetch (index)->value.ll += data_item->value.ll;
95*c42dbd0eSchristos       }
96*c42dbd0eSchristos     }
97*c42dbd0eSchristos }
98*c42dbd0eSchristos 
99*c42dbd0eSchristos Stats_data::Stats_item *
create_stats_item(long long v,char * l)100*c42dbd0eSchristos Stats_data::create_stats_item (long long v, char *l)
101*c42dbd0eSchristos {
102*c42dbd0eSchristos   Stats_data::Stats_item *st_it;
103*c42dbd0eSchristos   st_it = new Stats_data::Stats_item;
104*c42dbd0eSchristos   st_it->label = l;
105*c42dbd0eSchristos   st_it->value.sign = false;
106*c42dbd0eSchristos   st_it->value.ll = v;
107*c42dbd0eSchristos   st_it->value.tag = VT_LLONG;
108*c42dbd0eSchristos   return st_it;
109*c42dbd0eSchristos }
110*c42dbd0eSchristos 
111*c42dbd0eSchristos PrUsage *
fetchPrUsage(long index)112*c42dbd0eSchristos Stats_data::fetchPrUsage (long index)
113*c42dbd0eSchristos {
114*c42dbd0eSchristos   // Return the data values corresponding to the "index"'th sample.
115*c42dbd0eSchristos   PrUsage *prusage;
116*c42dbd0eSchristos   if (packets->getSize () > 0)
117*c42dbd0eSchristos     {
118*c42dbd0eSchristos       Sample* sample = (Sample*) packets->getObjValue (PROP_SMPLOBJ, index);
119*c42dbd0eSchristos       prusage = sample->get_usage ();
120*c42dbd0eSchristos       if (prusage != NULL)
121*c42dbd0eSchristos 	return prusage;
122*c42dbd0eSchristos     }
123*c42dbd0eSchristos   return new PrUsage;
124*c42dbd0eSchristos }
125*c42dbd0eSchristos 
126*c42dbd0eSchristos void
compute_data()127*c42dbd0eSchristos Stats_data::compute_data ()
128*c42dbd0eSchristos {
129*c42dbd0eSchristos   Stats_data::Stats_item *stats_item;
130*c42dbd0eSchristos   PrUsage *tots, *temp;
131*c42dbd0eSchristos   stats_items = new Vector<Stats_data::Stats_item*>;
132*c42dbd0eSchristos 
133*c42dbd0eSchristos   // Precomputation is needed.
134*c42dbd0eSchristos   long size = packets->getSize ();
135*c42dbd0eSchristos   tots = new PrUsage ();
136*c42dbd0eSchristos   for (long index = 0; index < size; index++)
137*c42dbd0eSchristos     {
138*c42dbd0eSchristos       temp = fetchPrUsage (index);
139*c42dbd0eSchristos       tots->pr_tstamp += temp->pr_tstamp;
140*c42dbd0eSchristos       tots->pr_create += temp->pr_create;
141*c42dbd0eSchristos       tots->pr_term += temp->pr_term;
142*c42dbd0eSchristos       tots->pr_rtime += temp->pr_rtime;
143*c42dbd0eSchristos       tots->pr_utime += temp->pr_utime;
144*c42dbd0eSchristos       tots->pr_stime += temp->pr_stime;
145*c42dbd0eSchristos       tots->pr_ttime += temp->pr_ttime;
146*c42dbd0eSchristos       tots->pr_tftime += temp->pr_tftime;
147*c42dbd0eSchristos       tots->pr_dftime += temp->pr_dftime;
148*c42dbd0eSchristos       tots->pr_kftime += temp->pr_kftime;
149*c42dbd0eSchristos       tots->pr_slptime += temp->pr_slptime;
150*c42dbd0eSchristos       tots->pr_ltime += temp->pr_ltime;
151*c42dbd0eSchristos       tots->pr_wtime += temp->pr_wtime;
152*c42dbd0eSchristos       tots->pr_stoptime += temp->pr_stoptime;
153*c42dbd0eSchristos       tots->pr_minf += temp->pr_minf;
154*c42dbd0eSchristos       tots->pr_majf += temp->pr_majf;
155*c42dbd0eSchristos       tots->pr_nswap += temp->pr_nswap;
156*c42dbd0eSchristos       tots->pr_inblk += temp->pr_inblk;
157*c42dbd0eSchristos       tots->pr_oublk += temp->pr_oublk;
158*c42dbd0eSchristos       tots->pr_msnd += temp->pr_msnd;
159*c42dbd0eSchristos       tots->pr_mrcv += temp->pr_mrcv;
160*c42dbd0eSchristos       tots->pr_sigs += temp->pr_sigs;
161*c42dbd0eSchristos       tots->pr_vctx += temp->pr_vctx;
162*c42dbd0eSchristos       tots->pr_ictx += temp->pr_ictx;
163*c42dbd0eSchristos       tots->pr_sysc += temp->pr_sysc;
164*c42dbd0eSchristos       tots->pr_ioch += temp->pr_ioch;
165*c42dbd0eSchristos     }
166*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_minf,
167*c42dbd0eSchristos 				  GTXT ("Minor Page Faults"));
168*c42dbd0eSchristos   stats_items->append (stats_item);
169*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_majf,
170*c42dbd0eSchristos 				  GTXT ("Major Page Faults"));
171*c42dbd0eSchristos   stats_items->append (stats_item);
172*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_nswap,
173*c42dbd0eSchristos 				  GTXT ("Process swaps"));
174*c42dbd0eSchristos   stats_items->append (stats_item);
175*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_inblk,
176*c42dbd0eSchristos 				  GTXT ("Input blocks"));
177*c42dbd0eSchristos   stats_items->append (stats_item);
178*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_oublk,
179*c42dbd0eSchristos 				  GTXT ("Output blocks"));
180*c42dbd0eSchristos   stats_items->append (stats_item);
181*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_msnd,
182*c42dbd0eSchristos 				  GTXT ("Messages sent"));
183*c42dbd0eSchristos   stats_items->append (stats_item);
184*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_mrcv,
185*c42dbd0eSchristos 				  GTXT ("Messages received"));
186*c42dbd0eSchristos   stats_items->append (stats_item);
187*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_sigs,
188*c42dbd0eSchristos 				  GTXT ("Signals handled"));
189*c42dbd0eSchristos   stats_items->append (stats_item);
190*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_vctx,
191*c42dbd0eSchristos 				  GTXT ("Voluntary context switches"));
192*c42dbd0eSchristos   stats_items->append (stats_item);
193*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_ictx,
194*c42dbd0eSchristos 				  GTXT ("Involuntary context switches"));
195*c42dbd0eSchristos   stats_items->append (stats_item);
196*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_sysc,
197*c42dbd0eSchristos 				  GTXT ("System calls"));
198*c42dbd0eSchristos   stats_items->append (stats_item);
199*c42dbd0eSchristos   stats_item = create_stats_item ((long long) tots->pr_ioch,
200*c42dbd0eSchristos 				  GTXT ("Characters of I/O"));
201*c42dbd0eSchristos   stats_items->append (stats_item);
202*c42dbd0eSchristos   delete tots;
203*c42dbd0eSchristos }
204