Introduced paired events for processes.
[pdm.git] / pdm / perf.py
CommitLineData
87b07b36 1import os, sys, resource, time, socket, threading
7f97a47e
FT
2
3class attrinfo(object):
4 def __init__(self, desc = None):
5 self.desc = desc
6
7class perfobj(object):
8 def __init__(self, *args, **kwargs):
9 super(perfobj, self).__init__()
10
11 def pdm_protocols(self):
12 return []
13
14class simpleattr(perfobj):
15 def __init__(self, func, info = None, *args, **kwargs):
16 super(simpleattr, self).__init__(*args, **kwargs)
17 self.func = func
18 if info is None:
19 info = attrinfo()
20 self.info = info
21
22 def readattr(self):
23 return self.func()
24
25 def attrinfo(self):
26 return self.info
27
28 def pdm_protocols(self):
29 return super(simpleattr, self).pdm_protocols() + ["attr"]
30
31class valueattr(perfobj):
32 def __init__(self, init, info = None, *args, **kwargs):
33 super(valueattr, self).__init__(*args, **kwargs)
34 self.value = init
35 if info is None:
36 info = attrinfo()
37 self.info = info
38
39 def readattr(self):
40 return self.value
41
42 def attrinfo(self):
43 return self.info
44
45 def pdm_protocols(self):
46 return super(valueattr, self).pdm_protocols() + ["attr"]
47
48
49class eventobj(perfobj):
50 def __init__(self, *args, **kwargs):
51 super(eventobj, self).__init__(*args, **kwargs)
52 self.subscribers = set()
53
54 def subscribe(self, cb):
55 if cb in self.subscribers:
56 raise ValueError("Already subscribed")
57 self.subscribers.add(cb)
58
59 def unsubscribe(self, cb):
60 self.subscribers.remove(cb)
61
62 def notify(self, event):
63 for cb in self.subscribers:
64 try:
65 cb(event)
66 except: pass
67
68 def pdm_protocols(self):
69 return super(eventobj, self).pdm_protocols() + ["event"]
70
71class staticdir(perfobj):
72 def __init__(self, *args, **kwargs):
73 super(staticdir, self).__init__(*args, **kwargs)
74 self.map = {}
75
76 def __setitem__(self, name, ob):
77 self.map[name] = ob
78
79 def __delitem__(self, name):
80 del self.map[name]
81
82 def __getitem__(self, name):
83 return self.map[name]
84
85 def get(self, name, default = None):
86 return self.map.get(name, default)
87
88 def listdir(self):
89 return self.map.keys()
90
91 def lookup(self, name):
92 return self.map[name]
93
94 def pdm_protocols(self):
95 return super(staticdir, self).pdm_protocols() + ["dir"]
96
bcb622d6
FT
97class event(object):
98 def __init__(self):
99 self.time = time.time()
100
87b07b36
FT
101idlock = threading.Lock()
102procevid = 0
103class startevent(event):
104 def __init__(self):
105 super(startevent, self).__init__()
106 global procevid
107 idlock.acquire()
108 try:
109 self.id = procevid
110 procevid += 1
111 finally:
112 idlock.release()
113
114class finishevent(event):
115 def __init__(self, start, aborted):
116 super(finishevent, self).__init__()
117 self.id = start.id
118 self.aborted = aborted
119
7f97a47e
FT
120sysres = staticdir()
121itime = time.time()
122ires = resource.getrusage(resource.RUSAGE_SELF)
123def ct():
124 ru = resource.getrusage(resource.RUSAGE_SELF)
125 return (ru.ru_utime - ires.ru_utime) + (ru.ru_stime - ires.ru_stime)
126sysres["realtime"] = simpleattr(func = lambda: time.time() - itime)
127sysres["cputime"] = simpleattr(func = ct)
128sysres["utime"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_utime - ires.ru_utime)
129sysres["stime"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_stime - ires.ru_stime)
130sysres["maxrss"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
131sysres["rusage"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF))
132
133sysinfo = staticdir()
134sysinfo["pid"] = simpleattr(func = os.getpid)
135sysinfo["uname"] = simpleattr(func = os.uname)
136sysinfo["hostname"] = simpleattr(func = socket.gethostname)
137sysinfo["platform"] = valueattr(init = sys.platform)