diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2008-12-03 16:31:02 -0200 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2008-12-03 16:31:02 -0200 |
commit | 74ffa3a3f3e547cd247fd5fe2b00d96ea7c0499e (patch) | |
tree | 7287f2b9209796de3d5ab716f4e79d5825bda328 | |
parent | ea50df0bf5faf22f1aa37c70fc2a44b9151a7a92 (diff) | |
download | python-linux-procfs-74ffa3a3f3e547cd247fd5fe2b00d96ea7c0499e.tar.gz |
pidstats: Move the /proc/PID/{stat,status} parsing to classes
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rwxr-xr-x | procfs/procfs.py | 116 |
1 files changed, 79 insertions, 37 deletions
diff --git a/procfs/procfs.py b/procfs/procfs.py index bbe2118..627c9dd 100755 --- a/procfs/procfs.py +++ b/procfs/procfs.py @@ -12,7 +12,7 @@ def process_cmdline(pid_info): return pid_info["stat"]["comm"] -class pidstats: +class pidstat: PF_ALIGNWARN = 0x00000001 PF_STARTING = 0x00000002 @@ -55,6 +55,81 @@ class pidstats: "rt_priority", "policy", "delayacct_blkio_ticks" ] + def __init__(self, pid, basedir = "/proc"): + self.pid = pid + self.load(basedir) + + def __getitem__(self, fieldname): + return self.fields[fieldname] + + def keys(self): + return self.fields.keys() + + def has_key(self, fieldname): + return self.fields.has_key(fieldname) + + def load(self, basedir = "/proc"): + f = open("%s/%d/stat" % (basedir, self.pid)) + fields = f.readline().strip().split() + f.close() + self.fields = {} + nr_fields = min(len(fields), len(self.proc_stat_fields)) + for i in range(nr_fields): + attrname = self.proc_stat_fields[i] + value = fields[i] + if attrname == "comm": + self.fields["comm"] = value.strip('()') + else: + try: + self.fields[attrname] = int(value) + except: + self.fields[attrname] = value + + def is_bound_to_cpu(self): + return self.fields["flags"] & self.PF_THREAD_BOUND and \ + True or False + + def process_flags(self): + sflags = [] + for attr in dir(self): + if attr[:3] != "PF_": + continue + value = getattr(self, attr) + if value & self.flags: + sflags.append(attr) + + return sflags + +class pidstatus: + + def __init__(self, pid, basedir = "/proc"): + self.pid = pid + self.load(basedir) + + def __getitem__(self, fieldname): + return self.fields[fieldname] + + def keys(self): + return self.fields.keys() + + def has_key(self, fieldname): + return self.fields.has_key(fieldname) + + def load(self, basedir = "/proc"): + f = open("%s/%d/status" % (basedir, self.pid)) + self.fields = {} + for line in f.readlines(): + fields = line.split(":") + name = fields[0] + value = fields[1].strip() + try: + self.fields[fields[0]] = int(value) + except: + self.fields[fields[0]] = value + f.close() + +class pidstats: + def __init__(self, basedir = "/proc"): self.basedir = basedir self.processes = {} @@ -76,26 +151,6 @@ class pidstats: def has_key(self, key): return self.processes.has_key(key) - def read_stat_entry(self, pid): - f = open("%s/%d/stat" % (self.basedir, pid)) - tags = {} - fields = f.readline().strip().split() - nr_fields = min(len(fields), len(self.proc_stat_fields)) - for i in range(nr_fields): - tags[self.proc_stat_fields[i]] = fields[i] - tags["comm"] = tags["comm"].strip('()') - f.close() - return tags - - def read_status_entry(self, pid): - f = open("%s/%d/status" % (self.basedir, pid)) - tags = {} - for line in f.readlines(): - fields = line.split(":") - tags[fields[0]] = fields[1].strip() - f.close() - return tags - def reload(self): del self.processes self.processes = {} @@ -108,13 +163,13 @@ class pidstats: self.processes[pid] = {} try: - self.processes[pid]["stat"] = self.read_stat_entry(pid) + self.processes[pid]["stat"] = pidstat(pid, self.basedir) except: del self.processes[pid] continue try: - self.processes[pid]["status"] = self.read_status_entry(pid) + self.processes[pid]["status"] = pidstatus(pid, self.basedir) except: del self.processes[pid] @@ -201,20 +256,7 @@ class pidstats: return priorities def is_bound_to_cpu(self, pid): - return int(self.processes[pid]["stat"]["flags"]) & \ - self.PF_THREAD_BOUND and True or False - - def process_flags(self, pid): - sflags = [] - flags = int(self.processes[pid]["stat"]["flags"]) - for attr in dir(self): - if attr[:3] != "PF_": - continue - value = getattr(self, attr) - if value & flags: - sflags.append(attr) - - return sflags + return self.processes[pid]["stat"].is_bound_to_cpu() class interrupts: def __init__(self): |