forked from luck/tmp_suning_uos_patched
perf scripts python: exported-sql-viewer.py: Factor out CallGraphModelBase
Factor out a base class CallGraphModelBase from CallGraphModel, so that CallGraphModelBase can be reused. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: https://lkml.kernel.org/n/tip-76eybebzjwvgnadkm2oufrqi@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
a448ba232a
commit
254c0d820b
|
@ -558,26 +558,12 @@ class CallGraphRootItem(CallGraphLevelItemBase):
|
||||||
self.child_items.append(child_item)
|
self.child_items.append(child_item)
|
||||||
self.child_count += 1
|
self.child_count += 1
|
||||||
|
|
||||||
# Context-sensitive call graph data model
|
# Context-sensitive call graph data model base
|
||||||
|
|
||||||
class CallGraphModel(TreeModel):
|
class CallGraphModelBase(TreeModel):
|
||||||
|
|
||||||
def __init__(self, glb, parent=None):
|
def __init__(self, glb, parent=None):
|
||||||
super(CallGraphModel, self).__init__(glb, parent)
|
super(CallGraphModelBase, self).__init__(glb, parent)
|
||||||
|
|
||||||
def GetRoot(self):
|
|
||||||
return CallGraphRootItem(self.glb)
|
|
||||||
|
|
||||||
def columnCount(self, parent=None):
|
|
||||||
return 7
|
|
||||||
|
|
||||||
def columnHeader(self, column):
|
|
||||||
headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "]
|
|
||||||
return headers[column]
|
|
||||||
|
|
||||||
def columnAlignment(self, column):
|
|
||||||
alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
|
|
||||||
return alignment[column]
|
|
||||||
|
|
||||||
def FindSelect(self, value, pattern, query):
|
def FindSelect(self, value, pattern, query):
|
||||||
if pattern:
|
if pattern:
|
||||||
|
@ -597,34 +583,7 @@ class CallGraphModel(TreeModel):
|
||||||
match = " GLOB '" + str(value) + "'"
|
match = " GLOB '" + str(value) + "'"
|
||||||
else:
|
else:
|
||||||
match = " = '" + str(value) + "'"
|
match = " = '" + str(value) + "'"
|
||||||
QueryExec(query, "SELECT call_path_id, comm_id, thread_id"
|
self.DoFindSelect(query, match)
|
||||||
" FROM calls"
|
|
||||||
" INNER JOIN call_paths ON calls.call_path_id = call_paths.id"
|
|
||||||
" INNER JOIN symbols ON call_paths.symbol_id = symbols.id"
|
|
||||||
" WHERE symbols.name" + match +
|
|
||||||
" GROUP BY comm_id, thread_id, call_path_id"
|
|
||||||
" ORDER BY comm_id, thread_id, call_path_id")
|
|
||||||
|
|
||||||
def FindPath(self, query):
|
|
||||||
# Turn the query result into a list of ids that the tree view can walk
|
|
||||||
# to open the tree at the right place.
|
|
||||||
ids = []
|
|
||||||
parent_id = query.value(0)
|
|
||||||
while parent_id:
|
|
||||||
ids.insert(0, parent_id)
|
|
||||||
q2 = QSqlQuery(self.glb.db)
|
|
||||||
QueryExec(q2, "SELECT parent_id"
|
|
||||||
" FROM call_paths"
|
|
||||||
" WHERE id = " + str(parent_id))
|
|
||||||
if not q2.next():
|
|
||||||
break
|
|
||||||
parent_id = q2.value(0)
|
|
||||||
# The call path root is not used
|
|
||||||
if ids[0] == 1:
|
|
||||||
del ids[0]
|
|
||||||
ids.insert(0, query.value(2))
|
|
||||||
ids.insert(0, query.value(1))
|
|
||||||
return ids
|
|
||||||
|
|
||||||
def Found(self, query, found):
|
def Found(self, query, found):
|
||||||
if found:
|
if found:
|
||||||
|
@ -678,6 +637,57 @@ class CallGraphModel(TreeModel):
|
||||||
def FindDone(self, thread, callback, ids):
|
def FindDone(self, thread, callback, ids):
|
||||||
callback(ids)
|
callback(ids)
|
||||||
|
|
||||||
|
# Context-sensitive call graph data model
|
||||||
|
|
||||||
|
class CallGraphModel(CallGraphModelBase):
|
||||||
|
|
||||||
|
def __init__(self, glb, parent=None):
|
||||||
|
super(CallGraphModel, self).__init__(glb, parent)
|
||||||
|
|
||||||
|
def GetRoot(self):
|
||||||
|
return CallGraphRootItem(self.glb)
|
||||||
|
|
||||||
|
def columnCount(self, parent=None):
|
||||||
|
return 7
|
||||||
|
|
||||||
|
def columnHeader(self, column):
|
||||||
|
headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "]
|
||||||
|
return headers[column]
|
||||||
|
|
||||||
|
def columnAlignment(self, column):
|
||||||
|
alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ]
|
||||||
|
return alignment[column]
|
||||||
|
|
||||||
|
def DoFindSelect(self, query, match):
|
||||||
|
QueryExec(query, "SELECT call_path_id, comm_id, thread_id"
|
||||||
|
" FROM calls"
|
||||||
|
" INNER JOIN call_paths ON calls.call_path_id = call_paths.id"
|
||||||
|
" INNER JOIN symbols ON call_paths.symbol_id = symbols.id"
|
||||||
|
" WHERE symbols.name" + match +
|
||||||
|
" GROUP BY comm_id, thread_id, call_path_id"
|
||||||
|
" ORDER BY comm_id, thread_id, call_path_id")
|
||||||
|
|
||||||
|
def FindPath(self, query):
|
||||||
|
# Turn the query result into a list of ids that the tree view can walk
|
||||||
|
# to open the tree at the right place.
|
||||||
|
ids = []
|
||||||
|
parent_id = query.value(0)
|
||||||
|
while parent_id:
|
||||||
|
ids.insert(0, parent_id)
|
||||||
|
q2 = QSqlQuery(self.glb.db)
|
||||||
|
QueryExec(q2, "SELECT parent_id"
|
||||||
|
" FROM call_paths"
|
||||||
|
" WHERE id = " + str(parent_id))
|
||||||
|
if not q2.next():
|
||||||
|
break
|
||||||
|
parent_id = q2.value(0)
|
||||||
|
# The call path root is not used
|
||||||
|
if ids[0] == 1:
|
||||||
|
del ids[0]
|
||||||
|
ids.insert(0, query.value(2))
|
||||||
|
ids.insert(0, query.value(1))
|
||||||
|
return ids
|
||||||
|
|
||||||
# Vertical widget layout
|
# Vertical widget layout
|
||||||
|
|
||||||
class VBox():
|
class VBox():
|
||||||
|
|
Loading…
Reference in New Issue
Block a user