diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2010-05-15 06:59:01 -0400 |
---|---|---|
committer | Johannes Berg <johannes@sipsolutions.net> | 2010-05-25 07:17:03 -0400 |
commit | f45a7087dc1b44d8e2572e4290b18ce00e8c228f (patch) | |
tree | 8d642584b8897ce3c2cc556f8fc9426ede6cc168 | |
parent | c7ef40e2af1961a98d8b2d605e65cceef6cfb5d8 (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.py | 38 |
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 | ||
21 | from functools import update_wrapper | ||
21 | from ctracecmd import * | 22 | from ctracecmd import * |
22 | 23 | ||
23 | """ | 24 | """ |
@@ -31,6 +32,24 @@ and it is recommended applications not use it directly. | |||
31 | TODO: consider a complete class hierarchy of ftrace events... | 32 | TODO: consider a complete class hierarchy of ftrace events... |
32 | """ | 33 | """ |
33 | 34 | ||
35 | def 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 | |||
34 | class Event(object): | 53 | class 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 | ||