diff options
Diffstat (limited to 'tools/perf/scripts/python/exported-sql-viewer.py')
| -rwxr-xr-x | tools/perf/scripts/python/exported-sql-viewer.py | 119 | 
1 files changed, 91 insertions, 28 deletions
| diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py index afec9479ca7f..74ef92f1d19a 100755 --- a/tools/perf/scripts/python/exported-sql-viewer.py +++ b/tools/perf/scripts/python/exported-sql-viewer.py @@ -88,20 +88,39 @@  #                                                                              7fab593ea956 48 89 15 3b 13 22 00                            movq  %rdx, 0x22133b(%rip)  # 8107675243232  2    ls       22011  22011  hardware interrupt     No         7fab593ea956 _dl_start+0x26 (ld-2.19.so) -> ffffffff86a012e0 page_fault ([kernel]) +from __future__ import print_function +  import sys  import weakref  import threading  import string -import cPickle +try: +	# Python2 +	import cPickle as pickle +	# size of pickled integer big enough for record size +	glb_nsz = 8 +except ImportError: +	import pickle +	glb_nsz = 16  import re  import os  from PySide.QtCore import *  from PySide.QtGui import *  from PySide.QtSql import * +pyside_version_1 = True  from decimal import *  from ctypes import *  from multiprocessing import Process, Array, Value, Event +# xrange is range in Python3 +try: +	xrange +except NameError: +	xrange = range + +def printerr(*args, **keyword_args): +	print(*args, file=sys.stderr, **keyword_args) +  # Data formatting helpers  def tohex(ip): @@ -1004,10 +1023,6 @@ class ChildDataItemFinder():  glb_chunk_sz = 10000 -# size of pickled integer big enough for record size - -glb_nsz = 8 -  # Background process for SQL data fetcher  class SQLFetcherProcess(): @@ -1066,7 +1081,7 @@ class SQLFetcherProcess():  				return True  			if space >= glb_nsz:  				# Use 0 (or space < glb_nsz) to mean there is no more at the top of the buffer -				nd = cPickle.dumps(0, cPickle.HIGHEST_PROTOCOL) +				nd = pickle.dumps(0, pickle.HIGHEST_PROTOCOL)  				self.buffer[self.local_head : self.local_head + len(nd)] = nd  			self.local_head = 0  		if self.local_tail - self.local_head > sz: @@ -1084,9 +1099,9 @@ class SQLFetcherProcess():  			self.wait_event.wait()  	def AddToBuffer(self, obj): -		d = cPickle.dumps(obj, cPickle.HIGHEST_PROTOCOL) +		d = pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)  		n = len(d) -		nd = cPickle.dumps(n, cPickle.HIGHEST_PROTOCOL) +		nd = pickle.dumps(n, pickle.HIGHEST_PROTOCOL)  		sz = n + glb_nsz  		self.WaitForSpace(sz)  		pos = self.local_head @@ -1198,12 +1213,12 @@ class SQLFetcher(QObject):  		pos = self.local_tail  		if len(self.buffer) - pos < glb_nsz:  			pos = 0 -		n = cPickle.loads(self.buffer[pos : pos + glb_nsz]) +		n = pickle.loads(self.buffer[pos : pos + glb_nsz])  		if n == 0:  			pos = 0 -			n = cPickle.loads(self.buffer[0 : glb_nsz]) +			n = pickle.loads(self.buffer[0 : glb_nsz])  		pos += glb_nsz -		obj = cPickle.loads(self.buffer[pos : pos + n]) +		obj = pickle.loads(self.buffer[pos : pos + n])  		self.local_tail = pos + n  		return obj @@ -1512,6 +1527,19 @@ def BranchDataPrep(query):  			" (" + dsoname(query.value(15)) + ")")  	return data +def BranchDataPrepWA(query): +	data = [] +	data.append(query.value(0)) +	# Workaround pyside failing to handle large integers (i.e. time) in python3 by converting to a string +	data.append("{:>19}".format(query.value(1))) +	for i in xrange(2, 8): +		data.append(query.value(i)) +	data.append(tohex(query.value(8)).rjust(16) + " " + query.value(9) + offstr(query.value(10)) + +			" (" + dsoname(query.value(11)) + ")" + " -> " + +			tohex(query.value(12)) + " " + query.value(13) + offstr(query.value(14)) + +			" (" + dsoname(query.value(15)) + ")") +	return data +  # Branch data model  class BranchModel(TreeModel): @@ -1539,7 +1567,11 @@ class BranchModel(TreeModel):  			" AND evsel_id = " + str(self.event_id) +  			" ORDER BY samples.id"  			" LIMIT " + str(glb_chunk_sz)) -		self.fetcher = SQLFetcher(glb, sql, BranchDataPrep, self.AddSample) +		if pyside_version_1 and sys.version_info[0] == 3: +			prep = BranchDataPrepWA +		else: +			prep = BranchDataPrep +		self.fetcher = SQLFetcher(glb, sql, prep, self.AddSample)  		self.fetcher.done.connect(self.Update)  		self.fetcher.Fetch(glb_chunk_sz) @@ -2065,14 +2097,6 @@ def IsSelectable(db, table, sql = ""):  		return False  	return True -# SQL data preparation - -def SQLTableDataPrep(query, count): -	data = [] -	for i in xrange(count): -		data.append(query.value(i)) -	return data -  # SQL table data model item  class SQLTableItem(): @@ -2096,7 +2120,7 @@ class SQLTableModel(TableModel):  		self.more = True  		self.populated = 0  		self.column_headers = column_headers -		self.fetcher = SQLFetcher(glb, sql, lambda x, y=len(column_headers): SQLTableDataPrep(x, y), self.AddSample) +		self.fetcher = SQLFetcher(glb, sql, lambda x, y=len(column_headers): self.SQLTableDataPrep(x, y), self.AddSample)  		self.fetcher.done.connect(self.Update)  		self.fetcher.Fetch(glb_chunk_sz) @@ -2140,6 +2164,12 @@ class SQLTableModel(TableModel):  	def columnHeader(self, column):  		return self.column_headers[column] +	def SQLTableDataPrep(self, query, count): +		data = [] +		for i in xrange(count): +			data.append(query.value(i)) +		return data +  # SQL automatic table data model  class SQLAutoTableModel(SQLTableModel): @@ -2168,8 +2198,32 @@ class SQLAutoTableModel(SQLTableModel):  			QueryExec(query, "SELECT column_name FROM information_schema.columns WHERE table_schema = '" + schema + "' and table_name = '" + select_table_name + "'")  			while query.next():  				column_headers.append(query.value(0)) +		if pyside_version_1 and sys.version_info[0] == 3: +			if table_name == "samples_view": +				self.SQLTableDataPrep = self.samples_view_DataPrep +			if table_name == "samples": +				self.SQLTableDataPrep = self.samples_DataPrep  		super(SQLAutoTableModel, self).__init__(glb, sql, column_headers, parent) +	def samples_view_DataPrep(self, query, count): +		data = [] +		data.append(query.value(0)) +		# Workaround pyside failing to handle large integers (i.e. time) in python3 by converting to a string +		data.append("{:>19}".format(query.value(1))) +		for i in xrange(2, count): +			data.append(query.value(i)) +		return data + +	def samples_DataPrep(self, query, count): +		data = [] +		for i in xrange(9): +			data.append(query.value(i)) +		# Workaround pyside failing to handle large integers (i.e. time) in python3 by converting to a string +		data.append("{:>19}".format(query.value(9))) +		for i in xrange(10, count): +			data.append(query.value(i)) +		return data +  # Base class for custom ResizeColumnsToContents  class ResizeColumnsToContentsBase(QObject): @@ -2854,9 +2908,13 @@ class LibXED():  		ok = self.xed_format_context(2, inst.xedp, inst.bufferp, sizeof(inst.buffer), ip, 0, 0)  		if not ok:  			return 0, "" +		if sys.version_info[0] == 2: +			result = inst.buffer.value +		else: +			result = inst.buffer.value.decode()  		# Return instruction length and the disassembled instruction text  		# For now, assume the length is in byte 166 -		return inst.xedd[166], inst.buffer.value +		return inst.xedd[166], result  def TryOpen(file_name):  	try: @@ -2872,9 +2930,14 @@ def Is64Bit(f):  	header = f.read(7)  	f.seek(pos)  	magic = header[0:4] -	eclass = ord(header[4]) -	encoding = ord(header[5]) -	version = ord(header[6]) +	if sys.version_info[0] == 2: +		eclass = ord(header[4]) +		encoding = ord(header[5]) +		version = ord(header[6]) +	else: +		eclass = header[4] +		encoding = header[5] +		version = header[6]  	if magic == chr(127) + "ELF" and eclass > 0 and eclass < 3 and encoding > 0 and encoding < 3 and version == 1:  		result = True if eclass == 2 else False  	return result @@ -2973,7 +3036,7 @@ class DBRef():  def Main():  	if (len(sys.argv) < 2): -		print >> sys.stderr, "Usage is: exported-sql-viewer.py {<database name> | --help-only}" +		printerr("Usage is: exported-sql-viewer.py {<database name> | --help-only}");  		raise Exception("Too few arguments")  	dbname = sys.argv[1] @@ -2986,8 +3049,8 @@ def Main():  	is_sqlite3 = False  	try: -		f = open(dbname) -		if f.read(15) == "SQLite format 3": +		f = open(dbname, "rb") +		if f.read(15) == b'SQLite format 3':  			is_sqlite3 = True  		f.close()  	except: | 
