package proc import ( "io/ioutil" "path/filepath" "strconv" "strings" "android/soong/finder/fs" ) // NewProcStatus returns an instance of the ProcStatus that contains memory // information of the process. The memory information is extracted from the // "/proc//status" text file. This is only available for Linux // distribution that supports /proc. func NewProcStatus(pid int, fileSystem fs.FileSystem) (*ProcStatus, error) { statusFname := filepath.Join("/proc", strconv.Itoa(pid), "status") r, err := fileSystem.Open(statusFname) if err != nil { return &ProcStatus{}, err } defer r.Close() data, err := ioutil.ReadAll(r) if err != nil { return &ProcStatus{}, err } s := &ProcStatus{ pid: pid, } for _, l := range strings.Split(string(data), "\n") { // If the status file does not contain "key: values", just skip the line // as the information we are looking for is not needed. if !strings.Contains(l, ":") { continue } // At this point, we're only considering entries that has key, single value pairs. kv := strings.SplitN(l, ":", 2) fillProcStatus(s, strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1])) } return s, nil }