#!/usr/bin/python

# Simple example of perf_event python module
#
# Copyright (C) 2009 Anton Blanchard <anton@au.ibm.com>, IBM
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version
# 2 of the License, or (at your option) any later version.


import re
import sys
import struct
import perf_event


def parse_perf_data(filename):

	p = perf_event.perf_event(filename)
	p.first_event()

	while p.event:
		if p.event_header.type == perf_event.event_type.MMAP:
			print "mmap %d %d %x %x %x %s" % (p.event.pid, p.event.tid,
				p.event.addr, p.event.len, p.event.pgoff,
				p.event.filename)

		if p.event_header.type == perf_event.event_type.MUNMAP:
			print "munmap %d %d %x %x %x %s" % (p.event.pid,
				p.event.tid, p.event.addr, p.event.len, p.event.pgoff,
				p.event.filename)

		elif p.event_header.type == perf_event.event_type.LOST:
			print "lost %d %d" % (p.event.id, p.event.lost)

		elif p.event_header.type == perf_event.event_type.COMM:
			print "comm %d %d %s" % (p.event.pid, p.event.tid,
				p.event.comm)

		elif p.event_header.type == perf_event.event_type.EXIT:
			print "exit %d %d %d %d %d" % (p.event.pid, p.event.ppid,
				p.event.tid, p.event.ptid, p.event.time)

		elif p.event_header.type == perf_event.event_type.THROTTLE:
			print "throttle %d %d %d" % (p.event.time, p.event.id,
				p.event.stream_id)

		elif p.event_header.type == perf_event.event_type.UNTHROTTLE:
			print "throttle %d %d %d" % (p.event.time, p.event.id,
				p.event.stream_id)

		elif p.event_header.type == perf_event.event_type.FORK:
			print "fork %d %d" % (p.event.pid, p.event.ppid)

		elif p.event_header.type == perf_event.event_type.SAMPLE:
			print "sample",

			try:
				print "ip %x" % p.event.ip,
			except:
				pass
			try:
				print "pid %d tid %d" % (p.event.pid, p.event.tid),
			except:
				pass
			try:
				print "time %d" % p.event.time,
			except:
				pass
			try:
				print "addr %x" % p.event.addr,
			except:
				pass
			try:
				print "id %d" % p.event.id,
			except:
				pass
			try:
				print "stream_id %d" % p.event.stream_id,
			except:
				pass
			try:
				print "cpu %d res %d" % (p.event.cpu, p.event.res),
			except:
				pass
			try:
				print "period %d" % p.event.period,
			except:
				pass
			try:
				for i in p.event.callchain:
					print "%x" % i,
			except:
				pass
			print

		p.next_event()


for file in sys.argv[1:]:
	parse_perf_data(file)
