Read clock granularity from the system rather than hardcoded value
[ais.git] / bin / proc.py
1 # -*- coding: utf-8 -*-
2
3 from __future__ import division
4 import subprocess
5
6 __proc_keys__ = (
7     # see man 5 proc
8     ('pid', int),
9     ('comm', str),
10     ('state', str),
11     ('ppid', int),
12     ('pgrp', int),
13     ('session', int),
14     ('tty_nr', int),
15     ('tpgid', int),
16     ('flags', int),
17     ('minflt', int),
18     ('cminflt', int),
19     ('majflt', int),
20     ('cmajflt', int),
21     ('utime', int),
22     ('stime', int),
23     ('cutime', int),
24     ('cstime', int),
25     ('priority', int),
26     ('nice', int),
27     ('num_threads', int),
28     ('itrealvalue', int),
29     ('starttime', int),
30     ('vsize', int),
31     ('rss', int),
32     ('rsslim', int),
33     ('startcode', int),
34     ('endcode', int),
35     ('startstack', int),
36     ('kstkesp', int),
37     ('kstkeip', int),
38     ('signal', int),
39     ('blocked', int),
40     ('sigignore', int),
41     ('sigcatch', int),
42     ('wchan', int),
43     ('nswap', int),
44     ('cnswap', int),
45     ('exit_signal', int),
46     ('processor', int),
47     ('rt_priority', int),
48     ('policy', int),
49     ('delayacct_blkio_ticks', int),
50     ('guest_time', int),
51     ('cguest_time', int),
52 )
53 __states__ = {
54     'R': 'running',
55     'S': 'sleeping',
56     'D': 'waiting disk',
57     'Z': 'zombie',
58     'T': 'stopped',
59     'W': 'swapping',
60 }
61
62 __clk_tck__ = None
63 def get_clk_tck():
64     # clocks per second:
65     #= 100 -> 1 tick = 1/100 seconds
66     global __clk_tck__
67     if __clk_tck__ is not None:
68         return __clk_tck__
69         
70     # require libc-bin to be installed. Priority is required anyways
71     process = subprocess.Popen(['getconf', 'CLK_TCK'], stdout=subprocess.PIPE)
72     output = process.communicate()[0]
73     retcode = process.returncode
74     if retcode != 0:
75         raise OsError("getconf CLK_TCK failed. subprocess returned " + str(retcode))
76     __clk_tck__ = int(output)
77     return __clk_tck__
78
79 class Stat(dict):
80     def __init__(self, processid):
81         dict.__init__(self)
82         strstats = open('/proc/%s/stat' % processid).read()
83         strstats = strstats.rstrip('\n').split(' ')
84         for i, keycls in enumerate(__proc_keys__):
85             key, cls = keycls
86             self[key] = cls(strstats[i])
87
88     def nice_state(self):
89         state = self['state']
90         nice_state = __states__.get(state, None)
91         if not nice_state:
92             return state
93         return "%s (%s)" % (state, nice_state)
94     
95     def nice_utime(self):
96         return self['utime'] / get_clk_tck()
97
98     def nice_stime(self):
99         return self['stime'] / get_clk_tck()
100
101 if __name__ == '__main__':
102     print "clock granularity is %s" % get_clk_tck()