aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2010-05-15 06:59:01 -0400
committerJohannes Berg <johannes@sipsolutions.net>2010-05-25 07:17:03 -0400
commitf45a7087dc1b44d8e2572e4290b18ce00e8c228f (patch)
tree8d642584b8897ce3c2cc556f8fc9426ede6cc168
parentc7ef40e2af1961a98d8b2d605e65cceef6cfb5d8 (diff)
python: cache properties
Address one TODO item and cache all properties (since currently all of them are immutable). Acked-by: Darren Hart <dvhltc@us.ibm.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
-rw-r--r--tracecmd.py38
1 files changed, 28 insertions, 10 deletions
diff --git a/tracecmd.py b/tracecmd.py
index 12af09b..b14a3b9 100644
--- a/tracecmd.py
+++ b/tracecmd.py
@@ -18,6 +18,7 @@
18# 2009-Dec-17: Initial version by Darren Hart <dvhltc@us.ibm.com> 18# 2009-Dec-17: Initial version by Darren Hart <dvhltc@us.ibm.com>
19# 19#
20 20
21from functools import update_wrapper
21from ctracecmd import * 22from ctracecmd import *
22 23
23""" 24"""
@@ -31,6 +32,24 @@ and it is recommended applications not use it directly.
31TODO: consider a complete class hierarchy of ftrace events... 32TODO: consider a complete class hierarchy of ftrace events...
32""" 33"""
33 34
35def cached_property(func, name=None):
36 if name is None:
37 name = func.__name__
38 def _get(self):
39 try:
40 return self.__cached_properties[name]
41 except AttributeError:
42 self.__cached_properties = {}
43 except KeyError:
44 pass
45 value = func(self)
46 self.__cached_properties[name] = value
47 return value
48 update_wrapper(_get, func)
49 def _del(self):
50 self.__cached_properties.pop(name, None)
51 return property(_get, None, _del)
52
34class Event(object): 53class Event(object):
35 """ 54 """
36 This class can be used to access event data 55 This class can be used to access event data
@@ -58,28 +77,27 @@ class Event(object):
58 def keys(self): 77 def keys(self):
59 return py_format_get_keys(self._format) 78 return py_format_get_keys(self._format)
60 79
61 # TODO: consider caching the results of the properties 80 @cached_property
62 @property
63 def comm(self): 81 def comm(self):
64 return pevent_data_comm_from_pid(self._pevent, self.pid) 82 return pevent_data_comm_from_pid(self._pevent, self.pid)
65 83
66 @property 84 @cached_property
67 def cpu(self): 85 def cpu(self):
68 return record_cpu_get(self._record) 86 return record_cpu_get(self._record)
69 87
70 @property 88 @cached_property
71 def name(self): 89 def name(self):
72 return event_format_name_get(self._format) 90 return event_format_name_get(self._format)
73 91
74 @property 92 @cached_property
75 def pid(self): 93 def pid(self):
76 return pevent_data_pid(self._pevent, self._record) 94 return pevent_data_pid(self._pevent, self._record)
77 95
78 @property 96 @cached_property
79 def ts(self): 97 def ts(self):
80 return record_ts_get(self._record) 98 return record_ts_get(self._record)
81 99
82 @property 100 @cached_property
83 def type(self): 101 def type(self):
84 return pevent_data_type(self._pevent, self._record) 102 return pevent_data_type(self._pevent, self._record)
85 103
@@ -108,7 +126,7 @@ class Field(object):
108 self._record = record 126 self._record = record
109 self._field = field 127 self._field = field
110 128
111 @property 129 @cached_property
112 def data(self): 130 def data(self):
113 return py_field_get_data(self._field, self._record) 131 return py_field_get_data(self._field, self._record)
114 132
@@ -133,7 +151,7 @@ class PEvent(object):
133 py_pevent_register_event_handler( 151 py_pevent_register_event_handler(
134 self._pevent, -1, subsys, event_name, l) 152 self._pevent, -1, subsys, event_name, l)
135 153
136 @property 154 @cached_property
137 def file_endian(self): 155 def file_endian(self):
138 if pevent_is_file_bigendian(self._pevent): 156 if pevent_is_file_bigendian(self._pevent):
139 return '>' 157 return '>'
@@ -161,7 +179,7 @@ class Trace(object):
161 179
162 self._pevent = tracecmd_get_pevent(self._handle) 180 self._pevent = tracecmd_get_pevent(self._handle)
163 181
164 @property 182 @cached_property
165 def cpus(self): 183 def cpus(self):
166 return tracecmd_cpus(self._handle) 184 return tracecmd_cpus(self._handle)
167 185