New proc get_clk_tck() function to analyse clock granularity
[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 def get_clk_tck():
63     process = subprocess.Popen(['getconf', 'CLK_TCK'], shell=True, stdout=subprocess.PIPE)
64     if process.wait() != 0:
65         raise "getconf CLK_TCK failed"
66     return process[0]
67
68     #= 100 -> 1 tick = 1/100 seconds
69     # require libc-bin to be installed
70
71 class Stat(dict):
72     def __init__(self, processid):
73         dict.__init__(self)
74         strstats = open('/proc/%s/stat' % processid).read()
75         strstats = strstats.rstrip('\n').split(' ')
76         for i, keycls in enumerate(__proc_keys__):
77             key, cls = keycls
78             self[key] = cls(strstats[i])
79
80     def nice_state(self):
81         state = self['state']
82         nice_state = __states__.get(state, None)
83         if not nice_state:
84             return state
85         return "%s (%s)" % (state, nice_state)
86     
87     # TODO: 
88     # subprocess.call(['getconf', 'CLK_TCK']) = 100 -> 1 tick = 1/100 seconds
89     def nice_utime(self):
90         return self['utime'] / 100
91
92     def nice_stime(self):
93         return self['stime'] / 100
94
95 if __name__ == '__main__':
96     print get_clk_tck()