xref: /aosp_15_r20/build/soong/ui/metrics/proc/status.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// package proc contains functionality to read proc status files.
2*333d2b36SAndroid Build Coastguard Workerpackage proc
3*333d2b36SAndroid Build Coastguard Worker
4*333d2b36SAndroid Build Coastguard Workerimport (
5*333d2b36SAndroid Build Coastguard Worker	"strconv"
6*333d2b36SAndroid Build Coastguard Worker	"strings"
7*333d2b36SAndroid Build Coastguard Worker)
8*333d2b36SAndroid Build Coastguard Worker
9*333d2b36SAndroid Build Coastguard Worker// ProcStatus holds information regarding the memory usage of
10*333d2b36SAndroid Build Coastguard Worker// an executing process. The memory sizes in each of the field
11*333d2b36SAndroid Build Coastguard Worker// is in bytes.
12*333d2b36SAndroid Build Coastguard Workertype ProcStatus struct {
13*333d2b36SAndroid Build Coastguard Worker	// Process PID.
14*333d2b36SAndroid Build Coastguard Worker	pid int
15*333d2b36SAndroid Build Coastguard Worker
16*333d2b36SAndroid Build Coastguard Worker	// Peak virtual memory size.
17*333d2b36SAndroid Build Coastguard Worker	VmPeak uint64
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Worker	// Virtual memory size.
20*333d2b36SAndroid Build Coastguard Worker	VmSize uint64
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	// Locked Memory size.
23*333d2b36SAndroid Build Coastguard Worker	VmLck uint64
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker	// Pinned memory size.
26*333d2b36SAndroid Build Coastguard Worker	VmPin uint64
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker	// Peak resident set size.
29*333d2b36SAndroid Build Coastguard Worker	VmHWM uint64
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	// Resident set size (sum of RssAnon, RssFile and RssShmem).
32*333d2b36SAndroid Build Coastguard Worker	VmRss uint64
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker	// Size of resident anonymous memory.
35*333d2b36SAndroid Build Coastguard Worker	RssAnon uint64
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Worker	// Size of resident shared memory.
38*333d2b36SAndroid Build Coastguard Worker	RssShmem uint64
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker	// Size of data segments.
41*333d2b36SAndroid Build Coastguard Worker	VmData uint64
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker	// Size of stack segments.
44*333d2b36SAndroid Build Coastguard Worker	VmStk uint64
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	//Size of text segments.
47*333d2b36SAndroid Build Coastguard Worker	VmExe uint64
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Worker	//Shared library code size.
50*333d2b36SAndroid Build Coastguard Worker	VmLib uint64
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker	// Page table entries size.
53*333d2b36SAndroid Build Coastguard Worker	VmPTE uint64
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	// Size of second-level page tables.
56*333d2b36SAndroid Build Coastguard Worker	VmPMD uint64
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	// Swapped-out virtual memory size by anonymous private.
59*333d2b36SAndroid Build Coastguard Worker	VmSwap uint64
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker	// Size of hugetlb memory page size.
62*333d2b36SAndroid Build Coastguard Worker	HugetlbPages uint64
63*333d2b36SAndroid Build Coastguard Worker}
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker// fillProcStatus takes the key and value, converts the value
66*333d2b36SAndroid Build Coastguard Worker// to the proper size unit and is stored in the ProcStatus.
67*333d2b36SAndroid Build Coastguard Workerfunc fillProcStatus(s *ProcStatus, key, value string) {
68*333d2b36SAndroid Build Coastguard Worker	v := strToUint64(value)
69*333d2b36SAndroid Build Coastguard Worker	switch key {
70*333d2b36SAndroid Build Coastguard Worker	case "VmPeak":
71*333d2b36SAndroid Build Coastguard Worker		s.VmPeak = v
72*333d2b36SAndroid Build Coastguard Worker	case "VmSize":
73*333d2b36SAndroid Build Coastguard Worker		s.VmSize = v
74*333d2b36SAndroid Build Coastguard Worker	case "VmLck":
75*333d2b36SAndroid Build Coastguard Worker		s.VmLck = v
76*333d2b36SAndroid Build Coastguard Worker	case "VmPin":
77*333d2b36SAndroid Build Coastguard Worker		s.VmPin = v
78*333d2b36SAndroid Build Coastguard Worker	case "VmHWM":
79*333d2b36SAndroid Build Coastguard Worker		s.VmHWM = v
80*333d2b36SAndroid Build Coastguard Worker	case "VmRSS":
81*333d2b36SAndroid Build Coastguard Worker		s.VmRss = v
82*333d2b36SAndroid Build Coastguard Worker	case "RssAnon":
83*333d2b36SAndroid Build Coastguard Worker		s.RssAnon = v
84*333d2b36SAndroid Build Coastguard Worker	case "RssShmem":
85*333d2b36SAndroid Build Coastguard Worker		s.RssShmem = v
86*333d2b36SAndroid Build Coastguard Worker	case "VmData":
87*333d2b36SAndroid Build Coastguard Worker		s.VmData = v
88*333d2b36SAndroid Build Coastguard Worker	case "VmStk":
89*333d2b36SAndroid Build Coastguard Worker		s.VmStk = v
90*333d2b36SAndroid Build Coastguard Worker	case "VmExe":
91*333d2b36SAndroid Build Coastguard Worker		s.VmExe = v
92*333d2b36SAndroid Build Coastguard Worker	case "VmLib":
93*333d2b36SAndroid Build Coastguard Worker		s.VmLib = v
94*333d2b36SAndroid Build Coastguard Worker	case "VmPTE":
95*333d2b36SAndroid Build Coastguard Worker		s.VmPTE = v
96*333d2b36SAndroid Build Coastguard Worker	case "VmPMD":
97*333d2b36SAndroid Build Coastguard Worker		s.VmPMD = v
98*333d2b36SAndroid Build Coastguard Worker	case "VmSwap":
99*333d2b36SAndroid Build Coastguard Worker		s.VmSwap = v
100*333d2b36SAndroid Build Coastguard Worker	case "HugetlbPages":
101*333d2b36SAndroid Build Coastguard Worker		s.HugetlbPages = v
102*333d2b36SAndroid Build Coastguard Worker	}
103*333d2b36SAndroid Build Coastguard Worker}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker// strToUint64 takes the string and converts to unsigned 64-bit integer.
106*333d2b36SAndroid Build Coastguard Worker// If the string contains a memory unit such as kB and is converted to
107*333d2b36SAndroid Build Coastguard Worker// bytes.
108*333d2b36SAndroid Build Coastguard Workerfunc strToUint64(v string) uint64 {
109*333d2b36SAndroid Build Coastguard Worker	// v could be "1024 kB" so scan for the empty space and
110*333d2b36SAndroid Build Coastguard Worker	// split between the value and the unit.
111*333d2b36SAndroid Build Coastguard Worker	var separatorIndex int
112*333d2b36SAndroid Build Coastguard Worker	if separatorIndex = strings.IndexAny(v, " "); separatorIndex < 0 {
113*333d2b36SAndroid Build Coastguard Worker		separatorIndex = len(v)
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker	value, err := strconv.ParseUint(v[:separatorIndex], 10, 64)
116*333d2b36SAndroid Build Coastguard Worker	if err != nil {
117*333d2b36SAndroid Build Coastguard Worker		return 0
118*333d2b36SAndroid Build Coastguard Worker	}
119*333d2b36SAndroid Build Coastguard Worker
120*333d2b36SAndroid Build Coastguard Worker	var scale uint64 = 1
121*333d2b36SAndroid Build Coastguard Worker	switch strings.TrimSpace(v[separatorIndex:]) {
122*333d2b36SAndroid Build Coastguard Worker	case "kB", "KB":
123*333d2b36SAndroid Build Coastguard Worker		scale = 1024
124*333d2b36SAndroid Build Coastguard Worker	case "mB", "MB":
125*333d2b36SAndroid Build Coastguard Worker		scale = 1024 * 1024
126*333d2b36SAndroid Build Coastguard Worker	}
127*333d2b36SAndroid Build Coastguard Worker	return value * scale
128*333d2b36SAndroid Build Coastguard Worker}
129