lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 25 Feb 2010 00:06:38 -0600
From:	Tom Zanussi <tzanussi@...il.com>
To:	Frederic Weisbecker <fweisbec@...il.com>
Cc:	linux-kernel@...r.kernel.org, mingo@...e.hu, rostedt@...dmis.org,
	k-keiichi@...jp.nec.com
Subject: Re: [PATCH 12/12] perf trace/scripting: add perf-trace-python
 Documentation

On Thu, 2010-02-25 at 02:37 +0100, Frederic Weisbecker wrote:
> 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)
> 

Yeah, being used to Perl hashes, I was surprised that Python dicts
didn't also allow that, or at least have an 'autovivify' option.

I guess defaultdicts, added later, are Python's answer to that
shortcoming (depending on how you look at it - I know a lot of people
hate them, but it sure makes aggregating trace data a lot easier).


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ