1 /* Copyright (C) 2021 Free Software Foundation, Inc.
2    Contributed by Oracle.
3 
4    This file is part of GNU Binutils.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3, or (at your option)
9    any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 #ifndef _HEAPDATA_H
22 #define _HEAPDATA_H
23 
24 #include "gp-defs.h"
25 #include "gp-time.h"
26 
27 #include "vec.h"
28 #include "data_pckts.h"
29 #include "Histable.h"
30 
31 #define TOTAL_HEAPNAME      NTXT("<Total>")
32 #define TOTAL_STACK_ID      0
33 #define _1KB                1024
34 #define _8KB                8192
35 #define _32KB               32768
36 #define _128KB              131072
37 #define _256KB              262144
38 #define _512KB              524288
39 #define _1000KB             1048576
40 #define _10MB               10485760
41 #define _100MB              104857600
42 #define _1GB                1073741824
43 #define _10GB               10737418240
44 #define _100GB              107374182400
45 #define _1TB                1099511627776
46 #define _10TB               10995116277760
47 
48 class HeapData : public Histable
49 {
50   friend class HeapActivity;
51 public:
52   HeapData (char *sName);
53   HeapData (HeapData *hData);
54   ~HeapData ();
55   char *get_raw_name (Histable::NameFormat nfmt);
56   void init ();
57   void setStackName (char* sName);
58   void setPeakMemUsage (int64_t pmu, uint64_t sId, hrtime_t ts, int procId, int uei);
59 
60   virtual char *get_name (Histable::NameFormat nfmt);
61   virtual void set_name (char * _name);
62   virtual Histable *convertto (Histable_type, Histable* = NULL);
63 
64   virtual Histable_type
get_type()65   get_type ()
66   {
67     return histType;
68   }
69 
70   virtual uint64_t
get_addr()71   get_addr ()
72   {
73     return stackId;
74   }
75 
76   uint64_t
get_index()77   get_index ()
78   {
79     return stackId;
80   }
81 
82   char *
getStackName()83   getStackName ()
84   {
85     return stackName;
86   }
87 
88   void
addAllocEvent(uint64_t nb)89   addAllocEvent (uint64_t nb)
90   {
91     allocBytes += nb;
92     allocCnt++;
93   }
94 
95   uint64_t
getAllocBytes()96   getAllocBytes ()
97   {
98     return allocBytes;
99   }
100 
101   int32_t
getAllocCnt()102   getAllocCnt ()
103   {
104     return allocCnt;
105   }
106 
107   void
addLeakEvent(uint64_t nb)108   addLeakEvent (uint64_t nb)
109   {
110     leakBytes += nb;
111     leakCnt++;
112   }
113 
114   uint64_t
getLeakBytes()115   getLeakBytes ()
116   {
117     return leakBytes;
118   }
119 
120   int32_t
getLeakCnt()121   getLeakCnt ()
122   {
123     return leakCnt;
124   }
125 
126   void
setStackId(uint64_t sId)127   setStackId (uint64_t sId)
128   {
129     stackId = sId;
130   }
131 
132   uint64_t
getStackId()133   getStackId ()
134   {
135     return stackId;
136   }
137 
138   void
setTimestamp(hrtime_t ts)139   setTimestamp (hrtime_t ts)
140   {
141     timestamp = ts;
142   }
143 
144   hrtime_t
getTimestamp()145   getTimestamp ()
146   {
147     return timestamp;
148   }
149 
150   void
setHistType(Histable::Type hType)151   setHistType (Histable::Type hType)
152   {
153     histType = hType;
154   }
155 
156   Histable::Type
getHistType()157   getHistType ()
158   {
159     return histType;
160   }
161 
162   int64_t
getPeakMemUsage()163   getPeakMemUsage ()
164   {
165     return peakMemUsage;
166   }
167 
168   Vector<uint64_t> *
getPeakStackIds()169   getPeakStackIds ()
170   {
171     return peakStackIds;
172   }
173 
174   Vector<hrtime_t> *
getPeakTimestamps()175   getPeakTimestamps ()
176   {
177     return peakTimestamps;
178   }
179 
180   void
setPid(int procId)181   setPid (int procId)
182   {
183     pid = procId;
184   }
185 
186   int
getPid()187   getPid ()
188   {
189     return pid;
190   }
191 
192   void
setUserExpId(int uei)193   setUserExpId (int uei)
194   {
195     userExpId = uei;
196   }
197 
198   int
getUserExpId()199   getUserExpId ()
200   {
201     return userExpId;
202   }
203 
204   void setAllocStat (int64_t nb);
205 
206   int64_t
getASmallestBytes()207   getASmallestBytes ()
208   {
209     return aSmallestBytes;
210   }
211 
212   int64_t
getALargestBytes()213   getALargestBytes ()
214   {
215     return aLargestBytes;
216   }
217 
218   int32_t
getA0KB1KBCnt()219   getA0KB1KBCnt ()
220   {
221     return a0KB1KBCnt;
222   }
223 
224   int32_t
getA1KB8KBCnt()225   getA1KB8KBCnt ()
226   {
227     return a1KB8KBCnt;
228   }
229 
230   int32_t
getA8KB32KBCnt()231   getA8KB32KBCnt ()
232   {
233     return a8KB32KBCnt;
234   }
235 
236   int32_t
getA32KB128KBCnt()237   getA32KB128KBCnt ()
238   {
239     return a32KB128KBCnt;
240   }
241 
242   int32_t
getA128KB256KBCnt()243   getA128KB256KBCnt ()
244   {
245     return a128KB256KBCnt;
246   }
247 
248   int32_t
getA256KB512KBCnt()249   getA256KB512KBCnt ()
250   {
251     return a256KB512KBCnt;
252   }
253 
254   int32_t
getA512KB1000KBCnt()255   getA512KB1000KBCnt ()
256   {
257     return a512KB1000KBCnt;
258   }
259 
260   int32_t
getA1000KB10MBCnt()261   getA1000KB10MBCnt ()
262   {
263     return a1000KB10MBCnt;
264   }
265 
266   int32_t
getA10MB100MBCnt()267   getA10MB100MBCnt ()
268   {
269     return a10MB100MBCnt;
270   }
271 
272   int32_t
getA100MB1GBCnt()273   getA100MB1GBCnt ()
274   {
275     return a100MB1GBCnt;
276   }
277 
278   int32_t
getA1GB10GBCnt()279   getA1GB10GBCnt ()
280   {
281     return a1GB10GBCnt;
282   }
283 
284   int32_t
getA10GB100GBCnt()285   getA10GB100GBCnt ()
286   {
287     return a10GB100GBCnt;
288   }
289 
290   int32_t
getA100GB1TBCnt()291   getA100GB1TBCnt ()
292   {
293     return a100GB1TBCnt;
294   }
295 
296   int32_t
getA1TB10TBCnt()297   getA1TB10TBCnt ()
298   {
299     return a1TB10TBCnt;
300   }
301 
302   void setLeakStat (int64_t nb);
303 
304   int64_t
getLSmallestBytes()305   getLSmallestBytes ()
306   {
307     return lSmallestBytes;
308   }
309 
310   int64_t
getLLargestBytes()311   getLLargestBytes ()
312   {
313     return lLargestBytes;
314   }
315 
316   int32_t
getL0KB1KBCnt()317   getL0KB1KBCnt ()
318   {
319     return l0KB1KBCnt;
320   }
321 
322   int32_t
getL1KB8KBCnt()323   getL1KB8KBCnt ()
324   {
325     return l1KB8KBCnt;
326   }
327 
328   int32_t
getL8KB32KBCnt()329   getL8KB32KBCnt ()
330   {
331     return l8KB32KBCnt;
332   }
333 
334   int32_t
getL32KB128KBCnt()335   getL32KB128KBCnt ()
336   {
337     return l32KB128KBCnt;
338   }
339 
340   int32_t
getL128KB256KBCnt()341   getL128KB256KBCnt ()
342   {
343     return l128KB256KBCnt;
344   }
345 
346   int32_t
getL256KB512KBCnt()347   getL256KB512KBCnt ()
348   {
349     return l256KB512KBCnt;
350   }
351 
352   int32_t
getL512KB1000KBCnt()353   getL512KB1000KBCnt ()
354   {
355     return l512KB1000KBCnt;
356   }
357 
358   int32_t
getL1000KB10MBCnt()359   getL1000KB10MBCnt ()
360   {
361     return l1000KB10MBCnt;
362   }
363 
364   int32_t
getL10MB100MBCnt()365   getL10MB100MBCnt ()
366   {
367     return l10MB100MBCnt;
368   }
369 
370   int32_t
getL100MB1GBCnt()371   getL100MB1GBCnt ()
372   {
373     return l100MB1GBCnt;
374   }
375 
376   int32_t
getL1GB10GBCnt()377   getL1GB10GBCnt ()
378   {
379     return l1GB10GBCnt;
380   }
381 
382   int32_t
getL10GB100GBCnt()383   getL10GB100GBCnt ()
384   {
385     return l10GB100GBCnt;
386   }
387 
388   int32_t
getL100GB1TBCnt()389   getL100GB1TBCnt ()
390   {
391     return l100GB1TBCnt;
392   }
393 
394   int32_t
getL1TB10TBCnt()395   getL1TB10TBCnt ()
396   {
397     return l1TB10TBCnt;
398   }
399 
400 private:
401   char *stackName;                  // stack name
402   uint64_t allocBytes;              // The total bytes allocated
403   uint64_t leakBytes;               // The total bytes leaked
404   int32_t allocCnt;                 // The alloc count
405   int32_t leakCnt;                  // The leak count
406   Histable::Type histType;          // The Histable type: HEAPCALLSTACK
407   int64_t peakMemUsage;             // Keep track of peak memory usage
408   uint64_t stackId;
409   Vector<uint64_t> *peakStackIds;   // The peak memory usage stack ids
410   hrtime_t timestamp;
411   Vector<hrtime_t> *peakTimestamps; // The peak data
412   int pid;                          // The process id
413   int userExpId;                    // The experiment id
414 
415   int64_t aSmallestBytes;
416   int64_t aLargestBytes;
417   int32_t a0KB1KBCnt;
418   int32_t a1KB8KBCnt;
419   int32_t a8KB32KBCnt;
420   int32_t a32KB128KBCnt;
421   int32_t a128KB256KBCnt;
422   int32_t a256KB512KBCnt;
423   int32_t a512KB1000KBCnt;
424   int32_t a1000KB10MBCnt;
425   int32_t a10MB100MBCnt;
426   int32_t a100MB1GBCnt;
427   int32_t a1GB10GBCnt;
428   int32_t a10GB100GBCnt;
429   int32_t a100GB1TBCnt;
430   int32_t a1TB10TBCnt;
431 
432   int64_t lSmallestBytes;
433   int64_t lLargestBytes;
434   int32_t l0KB1KBCnt;
435   int32_t l1KB8KBCnt;
436   int32_t l8KB32KBCnt;
437   int32_t l32KB128KBCnt;
438   int32_t l128KB256KBCnt;
439   int32_t l256KB512KBCnt;
440   int32_t l512KB1000KBCnt;
441   int32_t l1000KB10MBCnt;
442   int32_t l10MB100MBCnt;
443   int32_t l100MB1GBCnt;
444   int32_t l1GB10GBCnt;
445   int32_t l10GB100GBCnt;
446   int32_t l100GB1TBCnt;
447   int32_t l1TB10TBCnt;
448 };
449 
450 #endif
451