Messages in this thread |  | | | Date | Thu, 25 Feb 2010 02:37:23 +0100 | | From | Frederic Weisbecker <> | | Subject | Re: [PATCH 12/12] perf trace/scripting: add perf-trace-python Documentation |
| |
On Wed, Jan 27, 2010 at 02:28:03AM -0600, Tom Zanussi wrote: > +from perf_trace_context import * > +from Core import * > + > +def trace_end(): > + print "in trace_end" > + > +def raw_syscalls__sys_enter(event_name, context, common_cpu, > + common_secs, common_nsecs, common_pid, common_comm, > + id, args): > +---- > + > +In trace_end(), we'll simply print the results, but first we need to > +generate some results to print. To do that we need to have our > +sys_enter() handler do the necessary tallying until all events have > +been counted. A hash table indexed by syscall id is a good way to > +store that information; every time the sys_enter() handler is called, > +we simply increment a count associated with that hash entry indexed by > +that syscall id: > + > +---- > + syscalls = autodict() > + > + try: > + syscalls[id] += 1 > + except TypeError: > + syscalls[id] = 1 > +---- > + > +The syscalls 'autodict' object is a special kind of Python dictionary > +(implemented in Core.py) that implements Perl's 'autovivifying' hashes > +in Python i.e. with autovivifying hashes, you can assign nested hash > +values without having to go to the trouble of creating intermediate > +levels if they don't exist e.g syscalls[comm][pid][id] = 1 will create > +the intermediate hash levels and finally assign the value 1 to the > +hash entry for 'id' (because the value being assigned isn't a hash > +object itself, the initial value is assigned in the TypeError > +exception. Well, there may be a better way to do this in Python but > +that's what works for now).
That's smart. I wish python had a native type for that.
And looking how you made it easily.... def autodict(): return defaultdict(autodict)
|  |