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